2017-01-09 24 views
1

我有我使用Scala的內部應用程序一個Java POJO:斯卡拉似乎無法可變地圖轉換成Java地圖

​​

在我的Scala程序:

val ctx : AppRuntimeContext = new AppRuntimeContext() 
val ctxMap : Map[String,Fizz] = Map() 
// Some code that populates 'ctxMap' 
ctx.setContextMap(ctxMap) 

這通過將FO

type mismatch; found : scala.collection.mutable.Map[String,com.me.myapp.Fizz] required: java.util.Map[Object,Object]

因此,我試圖轉換ctxMapjava.util.Map:產生在setter方法編譯錯誤llowing import語句:

import collection.JavaConversions._ 

然後通過改變二傳手呼籲:

ctx.setContextMap(mapAsJavaMap(ctxMap)) 

但是我這樣做的時候我還得到一個編譯錯誤:

type mismatch; found : scala.collection.mutable.Map[String,com.me.myapp.Fizz] required: scala.collection.Map[Object,Object] Note: String <: Object, but trait Map is invariant in type A. You may wish to investigate a wildcard type such as _ <: Object. (SLS 3.2.10)

任何想法是什麼導致這個錯誤和修復是什麼?

+0

請注意,不推薦使用'JavaConversions'。改用'JavaConverters'和顯式調用'.asScala' /'.asJava'。 – maasg

回答

1

一種選擇是地圖鑄造成一個Map[Object, Object]

ctx.setContextMap(mapAsJavaMap(ctxMap.asInstanceOf[mutable.Map[Object, Object]])) 

一個更好的一個很可能會宣佈ctxMap作爲首位Map[Object, Object],儘管這將允許把不符合的對象預期[String, Fizz]類型:

val ctxMap : mutable.Map[Object, Object] = mutable.Map() 
// Some code that populates 'ctxMap' 
ctxMap.put("k", Fizz(1)) 

ctx.setContextMap(mapAsJavaMap(ctxMap))