2016-11-18 123 views
1

我认为我们可以依靠隐式转换将scala.Double转换为java.lang.Double。所以我尝试了以下方法:将Map [String,Double]转换为java.util.Map [String,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) 
} 

为什么不起作用?执行这种转换的惯用方法是什么?

回答

1

这里的问题是,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 
    } 
} 
1

似乎为String,你不需要做任何转换,但不是Double的情况。 您可以使用Predef中定义的方法double2Double将其转换为java.double。

import scala.collection.JavaConverters._ 

m.map { case (k, v) => k -> double2Double(v) }.asJava 

或另一种方式是做asInstanceOf将其直接转换成Java地图。

+0

'asInstanceOf'不会让您将Scala地图转换为Java地图。 –

3

您需要的double盒装版:

import scala.collection.JavaConverters._ 

m.mapValues(Double.box).asJava 

的implicits能的Double值转换为java.lang.Double,但不是Map[String,Double]java.util.Map[String,java.lang.Double]

String不需要转换,因为String一个java.lang.StringDouble同时是double(原语)。

相关问题