如何在需要 scala Map[String, Any] 的地方使用 java Map<String, Object>?

How to use java Map<String, Object> where scala Map[String, Any] is requred?

如何use/convert映射到scala Map[String, Any]?

Java 对象在 Scala 中被识别为 AnyRef。

有没有单行转换的?我想避免迭代新创建的 scala Map 和复制 refs。

提前致谢。

可能是这样的:

  val jmap = new HashMap[String, Object]
  jmap.put("1", new Date)

  import scala.collection.JavaConverters._

  val smap = jmap.asScala.mapValues(_.asInstanceOf[Any]).toMap
  test(smap)

  def test(m: Map[String, Any]): Unit = {
    println(m)
  }

还要注意 java.lang.Object 等同于 Scala 中的 AnyRef,而不是 Any

这应该有效:

import scala.collection.JavaConversions._
val javaMap = new HashMap[String,Object]
val scalaMap: Map[String,Any] = javaMap.toMap

或者,如果您不喜欢 "the magic of implicits",请执行以下操作:

import scala.collection.JavaConverters._ // note, this is a different import
val javaMap = new HashMap[String, Object]
val scalaMap: Map[String, Any] = javaMap.asScala.toMap // this .asScala is what the other version does implicitly

另请注意,最后的 toMap 是必需的,因为 javaMap.asScala returns 一个 mutable.Map,并且 Map[String,Any] 声明默认为 immutable.Map 默认。 如果您改用 scala.collection.Map,则不需要它:

import scala.collection.Map
import scala.collection.JavaConversions._
val javaMap = HashMap[String, Object]
val scalaMap: Map[String,Any] = javaMap // voila!

或明确地

import scala.collection.Map
import scala.collection.JavaConverters._
val javaMap = HashMap[String, Object]
val scalaMap: Map[String, Any] = javaMap.asScala