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 映射。我试过:
scalaMap = Map.empty ++ new collection.jcl.MapWrapper[String,Boolean] {
override def underlying = javaMap
}
and:
scalaMap = Map.empty ++ new collection.jcl.MapWrapper[java.lang.String,java.lang.Boolean] {
override def underlying = javaMap
}
由于泛型的原因,这些都无法编译 -java.lang.String
与 scala 字符串不同。
除了手动复制地图之外,有没有一种好方法可以做到这一点?
编辑:谢谢,所有好的答案,我从他们身上学到了很多东西。然而,我犯了一个错误,在这里发布了一个比我实际遇到的问题更简单的问题。所以,如果你允许的话,我会概括这个问题 - API 实际返回的是
java.util.Map<java.lang.String, java.util.Map<SomeJavaEnum,java.lang.String>>
我需要将其移至 Map[String, Map[SomeJavaEnum,String]]
它可能看起来不太复杂,但它增加了额外的类型擦除级别,我发现将其移动到 Scala 映射的唯一方法是深度复制它(使用您在下面建议的一些技术) 。有人有任何提示吗?我通过为我的确切类型定义隐式转换来解决我的问题,所以至少丑陋隐藏在它自己的特征中,但仍然感觉有点笨拙的深度复制很多。