【问题标题】:Scala can't seem to convert mutable maps into Java MapsScala 似乎无法将可变映射转换为 Java 映射
【发布时间】:2017-05-23 20:33:41
【问题描述】:

我有一个在 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 方法上产生编译器错误:

类型不匹配;找到:scala.collection.mutable.Map[String,com.me.myapp.Fizz] 需要:java.util.Map[Object,Object]

所以我尝试通过添加以下导入语句将ctxMap 转换为java.util.Map

import collection.JavaConversions._

然后通过将 setter 调用更改为:

ctx.setContextMap(mapAsJavaMap(ctxMap))

但是,当我这样做时,我仍然收到编译器错误:

类型不匹配;找到:scala.collection.mutable.Map[String,com.me.myapp.Fizz] 必需:scala.collection.Map[Object,Object] 注意:String <: object map a _>

任何想法是什么导致了这个错误以及修复方法是什么?

【问题讨论】:

  • 请注意,不推荐使用JavaConversions。改用JavaConverters 和显式调用.asScala / .asJava

标签: scala compiler-errors scala-collections type-mismatch


【解决方案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)) 

【讨论】:

    猜你喜欢
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2017-03-10
    相关资源
    最近更新 更多