java - 包含原语的 Scala 集合的安全转换

标签 java scala type-safety scala-java-interop

我正在处理 Java-Scala 混合项目,并且经常需要转换集合。

当我想转换基元集合时,我应该写这样的东西

val coll: Seq[Int] = Seq(1, 2, 3)

import scala.collection.JavaConverters._

val jColl = coll.map(v => Int.box(v)).asJava

但是,我知道 Java 和 Scala 泛型集合都使用装箱值,因此我可以安全地避免使用不必要的装箱进行迭代,而只需编写

val jColl = coll.asJava.asInstanceOf[java.util.List[java.lang.Integer]]

但是,如果我在集合类型或元素类型中犯了错误,编译器不会提示。

是否有一种类型安全的方法可以避免额外的迭代?至少有一种方法可以检查集合类型吗?

最佳答案

好吧,我想不出一种方法来避免 scala.Int -> java.lang.Integer 转换有点手动或不安全,但是如果您只需实现一次并重复使用它,就可以基本消除风险。

一种方法可能是:

import scala.language.higherKinds
implicit class IntCollectionBoxer[C[_] <: java.lang.Iterable[_]](elems: C[Int]) {
  def asJavaBoxed: C[java.lang.Integer] = elems.asInstanceOf[C[java.lang.Integer]]
}

(对于 Double 和其他类型重复)

那么用法就是这样,这是很难犯错误的:

val jColl = coll.asJava.asJavaBoxed

您可能还希望根据您的使用情况更改 C 上的绑定(bind)。

关于java - 包含原语的 Scala 集合的安全转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45172695/

相关文章:

具有类型安全访问器的 Scala 数据结构

android - 如何区分color int和color resource

java : For loop isn't breaking after reaching a particular condition .

scala - 如何在 Scala 中组合 2 个 Futures

java - 从泛型类派生类型

java - 如何在 Scala 中使用 java.String.format?

scala - 将所有过滤函数应用于一个值

java - JPanel 在调整大小时会被重新绘制几次,有时根本不会

java - 延迟从 admob 加载横幅广告

java - 有效的 Java 代码不是有效的 Groovy 代码?