我对 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)
^
有人可以帮助解释这里发生了什么吗?
最佳答案
java.util.HashMap
不提供通过传递 (K, V)
的可变参数来构造映射的功能,但是有一个接受 initialCapacity: Int
和 loadFactor: Float
的双参数构造函数,这就是为什么您会收到有关需要 Float 的编译错误的原因。
(针对 Scala 2.13+ 更新)Scala 中的惯用方法是仅使用 Scala 不可变映射(无需导入):
val map = Map("first" -> 1, "second" -> 2).asJava
如果您的 Scala 代码使用返回 java.util.Map
的 Java 库,您可以使用 scala.jdk.CollectionConverters
将其显式转换为 Scala 映射,如下所示:import scala.jdk.CollectionConverters._
val javaMap: java.util.Map[String, String] = // ...
val map = javaMap.asScala
// or vice versa if you need to pass it into the Java API
val javaMap = Map("first" -> 1, "second" -> 2).asJava
请注意, asScala
只是底层 Java 映射的包装器(因此,如果该映射是可变的,则包装的映射也将是可变的)并且是 scala.collection.Map
的实例。为了完全符合习惯并从 Scala 的不变性保证中受益,您可能需要在末尾添加另一个 .toMap
将其转换为 scala.collection.immutable.Map
(这是默认 Map)。如果您使用 scala 2.12 或更早版本,请使用
scala.jdk.CollectionConverters._
import scala.collection.JavaConverters._
代替。
关于scala - 在 Scala 中使用 java Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37829536/