2012-11-20 53 views
0

我有兩個Java類:LogEntryRecord爲什麼Java和Scala集合之間的自動轉換失敗?

LogEntry類有如下方法:

public LogEntry setRec(List<Map<String,List<Record>>> rec) 

在Scala中我試圖把RecordLogEntry這樣的:

import scala.collection.JavaConversions._ 
import collection.mutable._ 
val log = new LogEntry() 
val rec = new Record() 

val map:java.util.Map[String, java.util.List[Record]] = HashMap("sessionKey" -> ArrayBuffer(rec)) 
log.setRec(List(map)) 

但我得到一個編譯錯誤:

scala> val map:java.util.Map[String, java.util.List[Record]] = HashMap("sessionKey" -> ArrayBuffer(eventPart)) 
<console>:14: error: type mismatch; 
found : scala.collection.mutable.HashMap[String,scala.collection.mutable.ArrayBuffer[Record]] 
required: java.util.Map[String,java.util.List[Record]] 
     val map:java.util.Map[String, java.util.List[Record]] = HashMap("sessionKey" -> ArrayBuffer(eventPart)) 
                    ^

似乎自動約定從斯卡拉收集到Java集合失敗,但作爲the official doc描述:

mutable.Buffer <=>  java.util.List 
mutable.Map  <=>  java.util.Map 

scala> val jul: java.util.List[Int] = ArrayBuffer(1, 2, 3) 
jul: java.util.List[Int] = [1, 2, 3] 

scala> val m: java.util.Map[String, Int] = HashMap("abc" -> 1, "hello" -> 2) 
m: java.util.Map[String,Int] = {hello=2, abc=1} 

ArrayBuffer可以轉換爲java.util.ListHashMap可以轉換爲java.util.Map

那麼,爲什麼會發生此錯誤?

+0

@sschaef感謝您的耐心編輯,我會更加關注未來的格式和語法。 – DiveInto

回答

2

的隱式轉換並不適用於輸入參數(雖然你可以使用視圖邊界來模擬它)。也就是說,如果你有一個從FooBar隱式轉換,可用於Foo類型的值,其中需要Bar

val foo: Foo = ... 
def bar(b: Bar) = ... 
bar(foo) 

但(例如)Seq[Foo]不能用來代替Seq[Bar]

val foo: Foo = ... 
def bar(list: Seq[Bar]) = ... 
bar(Seq(foo)) // type error 

這就是爲什麼在這裏不能使用ArrayBufferjava.util.List之間的轉換。

+0

謝謝,你的回答解釋了爲什麼它不起作用,現在看起來並不像它那麼古怪。 – DiveInto

2

發生這種情況是由於scala隱式轉換中的一些怪癖。以下應該工作。

val map: java.util.Map[String, java.util.List[EventPart]] = 
    HashMap("sessionKey" -> (ArrayBuffer(eventPart):java.util.List[EventPart])) 

作爲一個測試,我做了

scala> val map:java.util.Map[String, java.util.List[String]] = 
    HashMap("sessionKey" -> (ArrayBuffer("aa"):java.util.List[String])) 
map: java.util.Map[String,java.util.List[String]] = {sessionKey=[aa]} 
+0

是啊,謝謝,不禁說這真的很奇怪。 – DiveInto

相關問題