Scala:mutable.Map[Any,Any] 不能应用于 mutable.Map[String,Int]

Posted

技术标签:

【中文标题】Scala:mutable.Map[Any,Any] 不能应用于 mutable.Map[String,Int]【英文标题】:Scala: mutable.Map[Any,Any] cannot be applied to mutable.Map[String,Int] 【发布时间】:2017-09-16 16:18:45 【问题描述】:

我是 Scala 新手。我对这个编译错误感到困惑:

我创建了这个HashMap 并在许多功能中使用它:

val valuesMap:mutable.Map[String,Int]=mutable.HashMap()

我有一个带有这个签名的函数:

def saveToPjCsv(map:mutable.Map[Any,Any], fileName: String, outputDir: String): Unit =

我将HashMap 传递给函数:

DataFrameUtils.saveToPjCsv(valuesMap,"categoryMap",".\\DataManipulation\\")

并得到这个编译错误:

错误:使用替代方法重载了方法值 saveToPjCsv:[INFO] (地图:scala.collection.mutable.Map[Any,Any],文件名: 字符串,输出目录:字符串)单位[信息](df: org.apache.spark.sql.DataFrame,fileName: String,outputDir: String)Unit [INFO] 无法应用于 (scala.collection.mutable.Map[String,Int], String, String)

为什么Map[Any,Any] 不接受Map[String,Int]

【问题讨论】:

【参考方案1】:

如果该方法接受您的Map[String,Int] 作为参数然后插入"MyKey" -> "My value",会发生什么情况?您的调用方法中将有一个 Map[String, Int] 实际上存储String -> String 数据。这就是代码无法编译的原因。

从编译器的角度来看,它失败的原因是因为mutable.Map[Any, Any]mutable.Map[String, Int] 是不同的类型,并且它们之间没有层次关系。没有关系的原因是因为您使用的可变集合不能使用方差。

如果您使用的是定义具有协方差的类型参数的不可变集合,这将起作用:

def saveToPjCsv(map:List[(Any, Any)], fileName: String, outputDir: String): Unit =

saveToPjCsv(List[(String, Int)](), "", "")

更好地理解什么是方差检查this out

【讨论】:

知道了!为澄清起见,您的答案是否适用于所有不可变集合? 每个不可变集合都定义了其类型的方差,检查定义如果类型是 +T 表示协方差 -T 逆变,只是 T 不变

以上是关于Scala:mutable.Map[Any,Any] 不能应用于 mutable.Map[String,Int]的主要内容,如果未能解决你的问题,请参考以下文章

Scala的类层级讲解

scala 中 AnyAnyRefObjectAnyVal 关系

scala 中 AnyAnyRefObjectAnyVal 关系

Scala 将 WrappedArray 或 Array[Any] 转换为 Array[String]

高效的方法将键和值添加到scala中的Set Map

Scala映射