一个 Java API 返回一个 java.util.Map<java.lang.String,java.lang.Boolean>
;我想把它放进一个 Map[String,Boolean]
中。
所以假设我们有:
var scalaMap : Map[String,Boolean] = Map.empty
val javaMap = new JavaClass().map() // Returns java.util.Map<java.lang.String,java.lang.Boolean>
你不能使用Map.empty ++ javaMap
,因为++
方法不知道Java maps。我尝试过:
scalaMap = Map.empty ++ new collection.jcl.MapWrapper[String,Boolean] {
override def underlying = javaMap
}
且:
scalaMap = Map.empty ++ new collection.jcl.MapWrapper[java.lang.String,java.lang.Boolean] {
override def underlying = javaMap
}
这两个都无法编译,因为泛型不匹配 - java.lang.String
不同于 scala 的 String。
有没有什么好方法可以解决这个问题,除了手动复制映射表?
编辑:谢谢大家的回答,收益颇丰。但是,我犯了一个错误,把一个比实际问题简单的问题发到这里了。如果您允许的话,我将概括一下问题 - API 实际返回的是
java.util.Map<java.lang.String, java.util.Map<SomeJavaEnum,java.lang.String>>
我需要将这个数据结构转换为Map[String,Map [SomeJavaEnum,String]]。
这可能看起来并不复杂,但它增加了额外的类型擦除层级,而我找到的将其转换为Scala map的唯一方法是深度复制(使用下面您建议的某些技术)。有没有任何提示?我通过为我的确切类型定义隐式转换来解决了我的问题,因此至少丑陋的部分隐藏在自己的特质中,但仍然感觉有点笨拙,要深度复制整个对象。