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
}
和:
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 映射的唯一方法是深度复制它(使用您在下面建议的一些技术) . 任何人有任何提示?我通过为我的确切类型定义一个隐式转换来解决我的问题,所以至少丑陋隐藏在它自己的特征中,但仍然感觉有点笨拙的深度复制很多。