【问题标题】:Safe cast of Scala collection containing primitives包含原语的 Scala 集合的安全转换
【发布时间】:2017-07-18 16:43:44
【问题描述】:

我正在处理混合 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]]

但是,如果我在集合类型或元素类型中出错,编译器不会抱怨。

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

【问题讨论】:

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


【解决方案1】:

好吧,我想不出一种方法来避免 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 的界限。

【讨论】:

  • 我认为这是隐式def而不是隐式类的好地方。无论如何,只要没有更好的想法出现,就接受答案。
猜你喜欢
  • 2011-01-10
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2020-07-09
  • 2010-10-15
  • 2013-07-06
相关资源
最近更新 更多