我正在研究混合的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]]
但是,如果我在集合类型或元素类型中出错,编译器不会抱怨。
是否有一种类型安全的方法可以避免额外的迭代?至少有一种方法可以检查收集类型吗?
答案 0 :(得分: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
上的界限。