我使用JavaConverters从Java SortedSet转到Vector。
val lines = function.getInstructions.asScala.toVector
我的getInstructions函数返回java.lang.Long的ArrayList,但消耗代码需要Scala.Long。有没有办法在不改变所有消耗代码的情况下使用Java.lang.Long?
此外,有没有办法隐式转换到值类,以允许随机访问ArrayList而不分配如上所述的额外对象?非常感谢您提供的任何见解。
答案 0 :(得分:14)
Scala有自动装箱,scala.Long
java.lang.Long
是Vector
的大部分时间。当值存储在像.asInstanceOf[Vector[scala.Long]]
这样的集合中时,几乎总是如此。目前,Vector
转换scala.Long
的类型是安全的,但could change in the future。
更安全的方法是显式转换值。 Scala在java.lang.Long
和map
之间进行了隐式转换,但他们不会转换这些类型的集合。但是,您可以将它们与.map(Long2long)
组合进行转换,例如java.lang.Long
将scala.Long
的集合转换为scala.collection.JavaConversions._
的集合。
关于第二个问题,如果您导入JavaConverters
而非JavaConverters
,则会获得一组隐式转化。但是,推荐的方法是使用implicit def convArrayList(al: ArrayList[java.lang.Long]): Vector[Long] =
al.asScala.map(Long2long)(collection.breakOut)
。在你的情况下它也会更有效,因为只需要创建一次包装器。
如果你真的喜欢快速和危险,你可以编写自己的隐式转换:
{{1}}