2012-07-26 208 views
9

看看JavaConversionsJavaConverters中的代码,我不确定在Java和Scala收集(在任何方向)之间转换的“正确”方式(以2.10)是。Java <->斯卡拉收集转换,斯卡拉2.10

似乎有很多@deprecated注释。

已经从Scala Team(Typesafe?)发布了一个明确的答案吗?

感谢, 约翰

+0

请参阅http://stackoverflow.com/questions/8301947/what-is-the-difference-between-javaconverters-and-javaconversions-in-scala – jond3k 2012-07-26 22:57:07

回答

13

我不知道任何这样的宣布,但你应该总是使用JavaConverters,即需要您指示与.asScala.asJava转换的人。

据我所知,JavaConverters是在2.8.1中引入的,因为2.8中的JavaConversions是危险的,并且很容易将意外转换成你不期望的东西。

6

以不同的方式的两部作品:

  • 随着JavaConverters你的对象将被拉皮条成一类支持asScala和asJava,让您以编程方式转换您的收藏。

  • 随着JavaConversions,一个Java/Scala的集合将自动要求

与后者的风险是获得错误的或不必要的转换付出了性能 故障时转换。另外,至少在Scala 2.9中没有隐式转换的缓存,即如果在方法内部应用两次相同的转换,转换代码将被调用两次。

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

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 

而不是发出错误类型,编译器斯卡拉Map转换为一个java.util.Map,其具有接受Object更宽松的签名。