2016-11-18 138 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(原語)。

相關問題