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

Ste*_* H. 5 java scala implicit-conversion value-class

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

    val lines = function.getInstructions.asScala.toVector
Run Code Online (Sandbox Code Playgroud)

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

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

win*_*ner 15

Scala有自动装箱,很多时候scala.Long是a java.lang.Long.当值存储在类似的集合中时,几乎总是如此Vector.目前,做一个.asInstanceOf[Vector[scala.Long]]转换类型是安全的Vector,但这可能会在未来发生变化.

更安全的方法是显式转换值.Scala在scala.Long和之间有隐式转换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)
Run Code Online (Sandbox Code Playgroud)