2017-01-09 100 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))