6

我正在使用 JavaConverters 从 Java SortedSet 转到 Vector。

    val lines = function.getInstructions.asScala.toVector

我的 getInstructions 函数返回 java.lang.Long 的 ArrayList,但使用代码需要 Scala.Long。有没有办法在不改变我所有的消费代码来使用 Java.lang.Long 的情况下做到这一点?

此外,有没有办法对值类进行隐式转换以允许随机访问 ArrayList 而无需像上面那样分配额外的对象?非常感谢您提供的任何见解。

4

1 回答 1

18

Scala 有自动装箱,所以很多时候 ascala.Longjava.lang.Long. 当值存储在像Vector. 目前可以安全地.asInstanceOf[Vector[scala.Long]]转换 的类型Vector,但将来可能会改变

更安全的方法是显式转换值。Scala 在scala.Longand之间有隐式转换java.lang.Long,但它们不会转换这些类型的集合。但是,您可以将它们与map转换组合,例如.map(Long2long)将集合转换java.lang.Longscala.Long.

至于你的第二个问题,如果你导入scala.collection.JavaConversions._而不是JavaConverters你将得到一组隐式转换。但是,推荐的方法是使用JavaConverters. 在您的情况下,它也会更有效,因为包装器只需创建一次。

如果你真的喜欢快速和危险的游戏,你可以编写自己的隐式转换:

implicit def convArrayList(al: ArrayList[java.lang.Long]): Vector[Long] =
  al.asScala.map(Long2long)(collection.breakOut)
于 2014-07-07T22:35:01.837 回答