查看 and 中的代码JavaConversions
,JavaConverters
我不确定在 Java 和 Scala 集合(在任一方向)之间转换的“正确”方式(使用 2.10)是。
似乎有很多 @deprecated 注释。
Scala 团队(Typesafe?)的明确答案是否已发布?
谢谢,约翰
查看 and 中的代码JavaConversions
,JavaConverters
我不确定在 Java 和 Scala 集合(在任一方向)之间转换的“正确”方式(使用 2.10)是。
似乎有很多 @deprecated 注释。
Scala 团队(Typesafe?)的明确答案是否已发布?
谢谢,约翰
这是危险的典型例子import JavaConversions._
:
scala> val m = Map(1 -> "one")
m: scala.collection.immutable.Map[Int,String] = Map(1 -> one)
scala> m.contains(1)
res0: Boolean = true
scala> m.contains("")
<console>:9: error: type mismatch;
found : String("")
required: Int
m.contains("")
^
scala> import collection.JavaConversions._
import collection.JavaConversions._
scala> m.contains("")
res2: Boolean = false
编译器没有发出类型错误,而是将 Scala 转换Map
为 a java.util.Map
,它有一个更宽松的签名来接受Object
.
我不知道有任何这样的声明,但您应该始终使用JavaConverters
,即要求您使用.asScala
and指示转换的声明.asJava
。
据我了解,JavaConverters
是在 2.8.1 中引入的,因为JavaConversions
2.8 中的 2.8 很危险,并且很容易意外地转换出你没有预料到的东西。
两者以不同的方式工作:
使用 JavaConverters,您的对象将被添加到一个支持 asScala 和 asJava 的类中,这使您可以以编程方式转换您的集合。
使用 JavaConversions,Java/Scala 集合将在需要时自动转换
后者的风险是获得错误或不必要的转换,从而导致性能故障。另外,至少在 Scala 2.9 中没有隐式转换的缓存,即如果在一个方法中应用了两次相同的转换,则转换代码会被调用两次。
当您显式转换集合时,如果您在“Java”版本中需要它,您将避免在同一方法中调用两次 .asScala。