我对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)
^
有人可以帮忙解释一下这里发生了什么吗?
答案 0 :(得分:9)
java.util.HashMap
无法通过传递(K, V)
的vararg来提供构建地图的功能,但是有一个双精度构造函数接受initialCapacity: Int
和loadFactor: 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
。在我看来,这是有道理的,因为asJava
和asScala
方法提供了更明确的方法来实现结果。