[英]Implicit conversion between Scala.Long and Java.lang.Long in collections
我正在使用JavaConverters从Java SortedSet转到Vector。
val lines = function.getInstructions.asScala.toVector
我的getInstructions函数返回java.lang.Long的ArrayList,但消费代码需要Scala.Long。 有没有办法在不改变所有消耗代码的情况下使用Java.lang.Long?
此外,有没有办法隐式转换到值类,以允许随机访问ArrayList而不分配如上所述的额外对象? 非常感谢您提供的任何见解。
Scala有自动装箱,很多时候scala.Long
都是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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.