Scala 似乎无法将可变映射转换为 Java 映射
Scala can't seem to convert mutable maps into Java Maps
我有一个在 Scala 应用程序中使用的 Java POJO:
public class AppRuntimeContext {
// Lots of stuff...
public Map<Object,Object> contextMap;
// Getters & setters, ctors, etc.
}
在我的 Scala 应用程序中:
val ctx : AppRuntimeContext = new AppRuntimeContext()
val ctxMap : Map[String,Fizz] = Map()
// Some code that populates 'ctxMap'
ctx.setContextMap(ctxMap)
这会在 setter 方法上产生编译器错误:
type mismatch; found : scala.collection.mutable.Map[String,com.me.myapp.Fizz] required: java.util.Map[Object,Object]
所以我尝试通过添加以下导入语句将 ctxMap
转换为 java.util.Map
:
import collection.JavaConversions._
然后将 setter 调用更改为:
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)
知道导致此错误的原因以及解决方法吗?
一个选项是将地图转换为 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))
我有一个在 Scala 应用程序中使用的 Java POJO:
public class AppRuntimeContext {
// Lots of stuff...
public Map<Object,Object> contextMap;
// Getters & setters, ctors, etc.
}
在我的 Scala 应用程序中:
val ctx : AppRuntimeContext = new AppRuntimeContext()
val ctxMap : Map[String,Fizz] = Map()
// Some code that populates 'ctxMap'
ctx.setContextMap(ctxMap)
这会在 setter 方法上产生编译器错误:
type mismatch; found : scala.collection.mutable.Map[String,com.me.myapp.Fizz] required: java.util.Map[Object,Object]
所以我尝试通过添加以下导入语句将 ctxMap
转换为 java.util.Map
:
import collection.JavaConversions._
然后将 setter 调用更改为:
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)
知道导致此错误的原因以及解决方法吗?
一个选项是将地图转换为 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))