2016-01-14 57 views
0

以下代碼會生成類型不匹配錯誤。我不明白爲什麼。scala中推斷的參數類型

var navigablemap=rst.getFamilyMap("a".getBytes()) 
var list = new ListBuffer[Long]() 
navigablemap.keySet().forEach((e:Array[Byte]) => list+=Bytes.toLong(e)) 

的NavigableMap具有類型的NavigableMap [數組[字節],數組[字節]]。 人們期望ë有類型數組[字節]

編譯器將報告以下錯誤消息。

類型不匹配;發現:Array [Byte]⇒list.type(與基礎類型Array [Byte]⇒list.type)required:java.util.function.Consumer [_>:Array [Byte]]

更新:以下作品。

var keys=navigablemap.keySet() 
var keysIterator=keys.iterator() 
while (keysIterator.hasNext){ 
    var e=keysIterator.next() 
    list+=Bytes.toLong(e) 
} 

因爲簡潔是我的目標之一,而我努力學習階,有沒有階一襯爲上面?

+0

你認爲'(e:Array [Byte])在做什麼? (所以它不是推斷的參數類型,但明確的) –

+0

是不是你在scala中使用java api?你不能簡單地通過需要java lambda的scala lambda。 –

+0

爲什麼編譯器認爲這個類型不是'Array [Byte]'?推斷的類型與預期的(和指定的)類型不同。 –

回答

0

這是一個愚蠢的錯誤。正如Lukasz評論的那樣,scala lambda不能代替java lambda。爲了將來的參考,這是工作解決方案。

var navigablemap=rst.getFamilyMap("a".getBytes()) 
val list = new ListBuffer[Long]() 
var keys=navigablemap.keySet() 
val scalaKeys=asScalaSet(keys) 
scalaKeys.foreach(x => list+=Bytes.toLong(x)) 

轉換asScalaSet很重要。