我认为我们可以依赖将scala.Double
转换为java.lang.Double
的隐式转换。所以我尝试了以下内容:
import scala.collection.JavaConverters._
object Main extends App {
def main(args: Array[String]) = {
val m = Map("10" -> 20.0)
doSome(m.asJava) //error. Type mismatch found: java.util.Map[String,scala.Double]
// required: java.util.Map[String,java.lang.Double]
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)
}
为什么它不起作用?进行这种转换的惯用方法是什么?
答案 0 :(得分:6)
您需要装箱版double
:
import scala.collection.JavaConverters._
m.mapValues(Double.box).asJava
隐含可以将Double
的值转换为java.lang.Double
,但不能将Map[String,Double]
转换为java.util.Map[String,java.lang.Double]
。
String
不需要转换,因为String
是java.lang.String
而Double
是double
(原始)。
答案 1 :(得分:3)
似乎对于String
,您不需要进行任何转换,但Double
不是这种情况。
您可以使用double2Double
中定义的方法Predef
转换为java.double。
import scala.collection.JavaConverters._
m.map { case (k, v) => k -> double2Double(v) }.asJava
或另一种方法是asInstanceOf
直接将其转换为Java地图。
答案 2 :(得分:2)
这里的问题是scala.Double
是一个原语(相当于Java double
),而java.lang.Double
是一个类。他们完全不是一回事。 JavaConverters
在Java Map和Scala Map之间转换,而不是它们的内容。这有效:
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
}
}