我是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]
(map:scala.collection.mutable.Map [Any,Any],fileName: String,outputDir:String)单位[INFO](df: org.apache.spark.sql.DataFrame,fileName:String,outputDir:String)单位 [INFO]无法应用 (scala.collection.mutable.Map [String,Int],String,String)
为什么不Map[Any,Any]
接受Map[String,Int]
?
答案 0 :(得分: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