集合中Scala.Long和Java.lang.Long之间的隐式转换

时间:2014-07-07 21:56:44

标签: java scala implicit-conversion value-class

我使用JavaConverters从Java SortedSet转到Vector。

    val lines = function.getInstructions.asScala.toVector

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

此外,有没有办法隐式转换到值类,以允许随机访问ArrayList而不分配如上所述的额外对象?非常感谢您提供的任何见解。

1 个答案:

答案 0 :(得分:14)

Scala有自动装箱,scala.Long java.lang.LongVector的大部分时间。当值存储在像.asInstanceOf[Vector[scala.Long]]这样的集合中时,几乎总是如此。目前,Vector转换scala.Long的类型是安全的,但could change in the future

更安全的方法是显式转换值。 Scala在java.lang.Longmap之间进行了隐式转换,但他们不会转换这些类型的集合。但是,您可以将它们与.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) 。在你的情况下它也会更有效,因为只需要创建一次包装器。

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

{{1}}