![](/img/trans.png)
[英]java.lang.String cannot be cast to java.lang.Double Error when trying to return Map[(String, String),(Double, Double)] from RDD
[英]Converting Map[String, Double] to java.util.Map[String, java.lang.Double]
我認為我們可以依賴隱式轉換將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)
}
為什么不起作用? 執行此類轉換的慣用方法是什么?
你需要盒裝版的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.String
而Double
是double
(原始)。
似乎對於String
,您不需要進行任何轉換,但Double
不是這種情況。 您可以使用double2Double
中定義的Predef
方法轉換為java.double。
import scala.collection.JavaConverters._
m.map { case (k, v) => k -> double2Double(v) }.asJava
或者另一種方法是將asInstanceOf
直接轉換為Java映射。
這里的問題是scala.Double
是一個原語(相當於Java double
),而java.lang.Double
是一個類。 他們完全不是一回事。 JavaConverters
在Java Map和Scala Map之間JavaConverters
轉換,而不是它們的內容。 這有效:
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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.