Java <->斯卡拉收集转换,斯卡拉2.10
问题描述:
看看JavaConversions
和JavaConverters
中的代码,我不确定在Java和Scala收集(在任何方向)之间转换的“正确”方式(以2.10)是。Java <->斯卡拉收集转换,斯卡拉2.10
似乎有很多@deprecated注释。
已经从Scala Team(Typesafe?)发布了一个明确的答案吗?
感谢, 约翰
答
我不知道任何这样的宣布,但你应该总是使用JavaConverters
,即需要您指示与.asScala
和.asJava
转换的人。
据我所知,JavaConverters
是在2.8.1中引入的,因为2.8中的JavaConversions
是危险的,并且很容易将意外转换成你不期望的东西。
答
以不同的方式的两部作品:
随着JavaConverters你的对象将被拉皮条成一类支持asScala和asJava,让您以编程方式转换您的收藏。
随着JavaConversions,一个Java/Scala的集合将自动要求
与后者的风险是获得错误的或不必要的转换付出了性能 故障时转换。另外,至少在Scala 2.9中没有隐式转换的缓存,即如果在方法内部应用两次相同的转换,转换代码将被调用两次。
当您明确地转换集合时,如果您在“Java”版本中需要它,您将避免以相同方法调用两次.asScala。
答
这对于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
而不是发出错误类型,编译器斯卡拉Map
转换为一个java.util.Map
,其具有接受Object
更宽松的签名。
请参阅http://stackoverflow.com/questions/8301947/what-is-the-difference-between-javaconverters-and-javaconversions-in-scala – jond3k 2012-07-26 22:57:07