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

时间:2017-09-16 16:18:46

标签: scala

我是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 [A​​ny,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]

1 个答案:

答案 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