将Map[String, Double]转换为java.util.Map[String, java.lang.Double]

3

我认为我们可以依靠隐式转换将 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)
}

为什么它不能工作?执行这种转换的惯用方法是什么?
3个回答

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

3

看起来对于String,您不需要进行任何转换,但对于Double不是这种情况。 您可以使用在Predef中定义的double2Double方法将其转换为java.double。

import scala.collection.JavaConverters._

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

另一种方式是使用 asInstanceOf 将其直接转换为 Java Map。

“asInstanceOf”不允许将Scala map转换为Java map。 - Alexey Romanov

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
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接