【问题标题】:Converting Map[String, Double] to java.util.Map[String, java.lang.Double]将 Map[String, Double] 转换为 java.util.Map[String, java.lang.Double]
【发布时间】:2016-11-18 17:24:43
【问题描述】:

我认为我们可以依赖将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)
}

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

【问题讨论】:

    标签: scala type-conversion


    【解决方案1】:

    你需要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.StringDoubledouble(原始)。

    【讨论】:

      【解决方案2】:

      似乎String 不需要进行任何转换,但Double 则不然。 您可以使用Predef 中定义的方法double2Double 转换为java.double。

      import scala.collection.JavaConverters._
      
      m.map { case (k, v) => k -> double2Double(v) }.asJava
      

      或者另一种方法是直接使用asInstanceOf 将其转换为Java map。

      【讨论】:

      • asInstanceOf 不允许您将 Scala 映射转换为 Java 映射。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 2016-07-29
        • 2013-05-24
        • 2014-01-29
        • 1970-01-01
        • 1970-01-01
        • 2016-07-21
        相关资源
        最近更新 更多