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 中 AnyAnyRefObjectAnyVal 关系
scala 中 AnyAnyRefObjectAnyVal 关系