Java < - > Scala Collection转换,Scala 2.10

Joh*_*ith 9 scala scala-collections

看着代码JavaConversionsJavaConverters,我不确定这是"正确"的方式(与2.10)到Java和Scala集合之间的转换(任一方向).

似乎有很多@deprecated注释.

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

谢谢,约翰

ret*_*nym 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
Run Code Online (Sandbox Code Playgroud)

编译器不会发出类型错误,而是将Scala Map转换为a java.util.Map,它具有接受的宽松签名Object.


Lui*_*hys 13

我不知道任何这样的宣言,但你应该总是使用JavaConverters,即那些要求你用.asScala和表示转换的宣言.asJava.

据我所知,它JavaConverters是在2.8.1中引入的,因为JavaConversions2.8中的内容是危险的,并且很容易意外转换你没想到的东西.


Edm*_*984 6

这两个以不同的方式工作:

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

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

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

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