在scala中使用java Map

时间:2016-06-15 08:04:58

标签: scala

我对Scala REPL中的这种行为感到非常困惑:

scala> import java.util.Map
import java.util.Map

scala> import java.util.HashMap
import java.util.HashMap

scala> val jMap:java.util.Map[String,Int]=new HashMap[String,Int]("first"->1,"second" -> 2)

<console>:12: error: type mismatch;
found   : (String, Int)
required: Float
   val jMap =new HashMap[String,Int]("first"->1,"second" -> 2)
                                                                     ^
<console>:12: error: type mismatch;
found   : (String, Int)
required: Float
   val jMap=new HashMap[String,Int]("first"->1,"second" -> 2)
                                                                                  ^

有人可以帮忙解释一下这里发生了什么吗?

1 个答案:

答案 0 :(得分:9)

java.util.HashMap无法通过传递(K, V)的vararg来提供构建地图的功能,但是有一个双精度构造函数接受initialCapacity: IntloadFactor: Float,&# 39;为什么你得到关于需要Float的编译错误。

Scala中的优先方法只是使用Scala不可变映射(不需要导入),或者,如果Java互操作是您愿意实现的,只需导入JavaConverters

import scala.collection.JavaConverters._

val map = Map("first" -> 1, "second" -> 2).asJava
// map: java.util.Map[String,Int] = {first=1, second=2}

JavaConversions(两者都是互斥的,所以请根据自己的喜好选择):

import java.util.{Map => JMap}    
import scala.collection.JavaConversions._

val map: JMap[String, Int] = Map("first" -> 1, "second" -> 2)
// map: java.util.Map[String,Int] = {first=1, second=2}

更新:正如@Jasper-M的评论所指出的那样,JavaConversions从scala 2.12开始被弃用,而不是JavaConverters。在我看来,这是有道理的,因为asJavaasScala方法提供了更明确的方法来实现结果。