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