Java< - > Scala Collection转换,Scala 2.10

时间:2012-07-26 22:33:19

标签: scala scala-collections

查看JavaConversionsJavaConverters中的代码,我不确定在Java和Scala集合之间(在任一方向上)之间转换的“正确”方式(使用2.10)是什么。

似乎有很多@deprecated注释。

Scala团队(Typesafe?)的确定答案是否已发布?

谢谢, 约翰

3 个答案:

答案 0 :(得分:16)

这是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转换为java.util.Map,它具有接受Object的宽松签名。

答案 1 :(得分:13)

我不知道有任何此类宣言,但您应该始终使用JavaConverters,即需要您使用.asScala.asJava来表示转化的那些宣言。

根据我的理解,JavaConverters被引入2.8.1,因为2.8中的JavaConversions是危险的,并且很容易意外转换你不期望它的东西。

答案 2 :(得分:6)

两者以不同的方式运作:

  • 使用JavaConverters,您的对象将被拉入一个支持asScala和asJava的类,它允许您以编程方式转换您的集合。

  • 使用JavaConversions,Java / Scala集合将在需要时自动转换

后者的风险是获得支付表演的错误或不必要的转换 故障。此外,至少在Scala 2.9中没有隐式转换的缓存,即如果在方法内应用两次相同的转换,则转换代码被调用两次。

当你明确地转换一个集合时,如果你需要它在“Java”版本中,你将避免以相同的方法调用两次.asScala。