【问题标题】:Java <-> Scala Collection conversions, Scala 2.10 [duplicate]Java <-> Scala 集合转换,Scala 2.10 [重复]
【发布时间】:2012-07-25 14:43:09
【问题描述】:

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

似乎有很多@deprecated注解。

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

谢谢, 约翰

【问题讨论】:

标签: scala scala-collections


【解决方案1】:

这是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

【讨论】:

    【解决方案2】:

    我不知道有任何此类声明,但您应该始终使用 JavaConverters,即要求您使用 .asScala.asJava 指示转换的声明。

    据我了解,JavaConverters 是在 2.8.1 中引入的,因为 2.8 中的 JavaConversions 很危险,并且很容易意外地转换出你意想不到的东西。

    【讨论】:

      【解决方案3】:

      两者的工作方式不同:

      • 使用 JavaConverters,您的对象将被添加到支持 asScala 和 asJava 的类中,让您可以通过编程方式转换您的集合。

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

      后者的风险是获得错误或不必要的转化,从而为绩效付出代价 过错。此外,至少在 Scala 2.9 中没有隐式转换的缓存,即如果在一个方法中应用两次相同的转换,则转换代码会被调用两次。

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

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多