如何将嵌套的scala集合转换为嵌套的Java集合

Ada*_*m K 16 java generics scala scala-collections

我在Scala和Java之间有编译问题.

我的Java代码需要一个

java.util.Map<Double, java.lang.Iterable<Foo>>
Run Code Online (Sandbox Code Playgroud)

我的scala代码有一个

Map[Double, Vector[Foo]]
Run Code Online (Sandbox Code Playgroud)

我收到编译错误:

error: type mismatch;
found   : scala.collection.immutable.Map[scala.Double,Vector[Foo]
required: java.util.Map[java.lang.Double,java.lang.Iterable[Foo]]
Run Code Online (Sandbox Code Playgroud)

似乎scala.collection.JavaConversions不适用于嵌套集合,即使Vector可以被隐式转换为Iterable.没有迭代scala集合并手动进行转换,我可以做些什么来使类型工作?

drs*_*ens 7

scala.collection.JavaConversions应该弃用恕我直言.最好通过使用来明确转换发生的位置和时间scala.collection.JavaConverters.在你的情况下:

import scala.collection.JavaConverters._

type Foo = Int // Just to make it compile
val scalaMap = Map(1.0 -> Vector(1, 2)) // As an example

val javaMap = scalaMap.map { 
  case (d, v) => d -> v.toIterable.asJava
}.asJava
Run Code Online (Sandbox Code Playgroud)


小智 6

这更适合我的需求:

  def toJava(m: Any): Any = {
    import java.util
    import scala.collection.JavaConverters._
    m match {
      case sm: Map[_, _] => sm.map(kv => (kv._1, toJava(kv._2))).asJava
      case sl: Iterable[_] => new util.ArrayList(sl.map( toJava ).asJava.asInstanceOf[util.Collection[_]])
      case _ => m
    }
  }
Run Code Online (Sandbox Code Playgroud)