【问题标题】:Scala: mutable.Map[Any,Any] cannot be applied to mutable.Map[String,Int]Scala:mutable.Map[Any,Any] 不能应用于 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]

【问题讨论】:

    标签: scala


    【解决方案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 不变
    猜你喜欢
    • 2017-04-14
    • 2017-06-07
    • 1970-01-01
    • 2018-08-05
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    相关资源
    最近更新 更多