一个将Java Map转换为Scala Map的函数

17 浏览
0 Comments

一个将Java Map转换为Scala Map的函数

我对Scala完全不熟悉,所以非常感谢任何帮助。我正在尝试通过JVM将对象从Python传递给Scala,因此我需要一个函数,它以Java映射作为输入并返回一个Scala映射作为输出。

我还不确定是否希望映射是可变的还是不可变的,但是我尝试使用.asScala.toMap来使其不可变,但是出现了错误。我认为问题出在函数语法上?

代码如下:

private object PythonUtils {
  def toScalaMap[K, V](jm: java.util.Map[K, V]): Map[K, V] = {
    jm.asScala
  }
}

从目前的情况来看,该函数对参数进行类型检查,然后接受Java映射并将其转换为Scala。然而,当我编译时,出现了“类型不匹配”错误“找到:scala.collection.mutable.Map[K,V] 需要 java.util.Map[K,V]”。非常感谢任何帮助!

0
0 Comments

问题:编译出现类型不匹配错误,需要将Java的Map转换为Scala的Map。

解决方法:通过导入JavaConverters包中的asScala方法,可以将Java的Map转换为Scala的mutable.Map或immutable.Map。具体实现代码如下:

import scala.collection.JavaConverters._
import scala.collection.mutable
def toScalaMutableMap[K, V](jm: java.util.Map[K, V]): mutable.Map[K, V] = {
  jm.asScala
}
def toScalaImmutableMap[K, V](jm: java.util.Map[K, V]): Map[K, V] = {
  jm.asScala.toMap
}

同时,需要在项目的依赖中添加scala-java8-compat库的引用:

libraryDependencies += "org.scala-lang.modules" %% "scala-java8-compat" % "0.9.0"

该问题的原因是在编译过程中发现类型不匹配,期望的类型是java.util.Map[K,V],但实际传入的是scala.collection.mutable.Map[K,V]。造成这个问题的原因可能是在代码中导入了java.util.Map,导致Map引用被解析为java.util.Map而非scala.Predef.Map(即scala.immutable.Map)。

为了解决这个问题,可以尝试移除对java.util.Map的导入,这样Map引用将被解析为scala.Predef.Map,从而符合预期的类型要求。

参考链接:

- [Convert Java Map to Scala Map](https://stackoverflow.com/questions/16918956)

- [Converting mutable to immutable map](https://stackoverflow.com/questions/2817055)

0