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

问题描述

Scala具有自动装箱功能,因此在大多数情况下,ascala.Longjava.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的随机访问而无需如上所述分配额外的对象?非常感谢您提供的任何见解。

相关问答

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
JavaMail问题:无法将命令发送到SMTP主机