2017-09-16 31 views
1

我是Scala的新手。我在此編譯錯誤困惑:Scala:mutable.Map [A​​ny,Any]不能應用於mutable.Map [String,Int]

我創建這個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\\") 

並獲得日編譯錯誤:

error: overloaded method value saveToPjCsv with alternatives: [INFO]
(map: scala.collection.mutable.Map[Any,Any],fileName: String,outputDir: String)Unit [INFO] (df: org.apache.spark.sql.DataFrame,fileName: String,outputDir: String)Unit [INFO] cannot be applied to (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

+0

明白了!澄清一下,你的答案是否適用於所有不可變的集合? – Jake

+1

每個不可變集合定義其類型的方差,檢查定義如果類型是+ T意味着協方差-T逆變且只是T不變 – Mikel

相關問題