I thought we can rely on implicit conversion which converts scala.Double
to java.lang.Double
. So I tried the following:
import scal
It seems that for String
, you don't need to do any conversion, but is not the case for Double
.
You can use the method double2Double
which is defined in Predef
to convert to java.double.
import scala.collection.JavaConverters._
m.map { case (k, v) => k -> double2Double(v) }.asJava
or another way is to do asInstanceOf
to convert it to Java map directly.
You need the boxed version of double
:
import scala.collection.JavaConverters._
m.mapValues(Double.box).asJava
The implicits are able to convert a value of Double
to java.lang.Double
, but not a Map[String,Double]
to java.util.Map[String,java.lang.Double]
.
String
requires no conversion because String
is a java.lang.String
while Double
is a double
(primitive).
The issue here is that scala.Double
is a primitive (equivalent to Java double
) while java.lang.Double
is a class. They are not at all the same thing. The JavaConverters
converts between Java Map and Scala Map, not their contents. This works:
import scala.collection.JavaConverters._
object Main {
def main(args: Array[String]): Unit = {
val m = Map("10" -> 20.0)
doSome(mapConv(m))
doSome2(m.asJava)
}
def doSome(m: java.util.Map[java.lang.String, java.lang.Double]) = println(m)
def doSome2(m: java.util.Map[java.lang.String, Double]) = println(m)
def mapConv(msd: Map[String, Double]): java.util.Map[java.lang.String, java.lang.Double] = {
msd.map { case (k, v) => (k -> new java.lang.Double(v)) }.asJava
}
}