问题描述
Scala具有自动装箱功能,因此在大多数情况下,ascala.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)
解决方法
我正在使用JavaConverters将Java SortedSet转换为Vector。
val lines = function.getInstructions.asScala.toVector
我的getInstructions函数返回java.lang.Long的ArrayList,但是使用代码需要Scala.Long。有没有一种方法可以在不将所有使用代码都更改为使用Java.lang.Long的情况下进行操作?
此外,是否有一种方法可以对值类进行隐式转换,以允许对ArrayList的随机访问而无需如上所述分配额外的对象?非常感谢您提供的任何见解。