2017-04-02 69 views
0

我試圖返回一個Map[CharSequence, CharSequence]。該函數的要點是檢查另一個映射是否具有某個鍵/值對,然後返回特定的CharSequence映射。斯卡拉字符串的地圖不編譯當CharSequence預計

如果我只是返回一個空的地圖(或串地圖),這個編譯

def returnCharSequenceMap(someOtherMap: Option[Map[String,String]]): Map[CharSequence, CharSequence] = { 
    Map.empty // or something like Map("A" -> "B") 
} 

然而,這無法編譯

def returnCharSequenceMap(someOtherMap: Option[Map[String, String]]): Map[CharSequence, CharSequence] = { 
    someOtherMap.map { mapRecord => 
     case Some("conditionA") => 
      Map("a" -> "b") 
     case Some("conditionB") => 
      Map("a" -> "b", "c" -> "d") 
     case _ => Map.empty 
    } 
}.getOrElse(Map.empty) 

我得到這個,我不能破譯非常無厘頭的錯誤:

[error] found : scala.collection.immutable.Map[_19,String] where type _19 >: _1 <: CharSequence 
[error] required: Map[CharSequence,CharSequence] 
[error] Note: _19 <: CharSequence, but trait Map is invariant in type A. 
[error] You may wish to investigate a wildcard type such as `_ <: CharSequence`. (SLS 3.2.10) 
[error]  }.getOrElse(Map.empty) 

有人可以幫助指出我做錯了什麼嗎?我試圖理解爲什麼我不能只返回地圖。謝謝!

回答

2

首先,您不能在像這樣的函數內部進行模式匹配,而不會將其與match關鍵字一起引入:您的模式匹配是什麼?

然後,假設您想要模式匹配上mapRecord(在這種情況下,你可以簡單地刪除mapRecord =>,因爲功能可以作爲它的參數與模式匹配)指出,它永遠不會匹配,因爲在功能map需要Map[String, String]類型的參數,而不是Option[Map[String, String]]類型的參數。

雖然我們在這,你可以使用collect方法上Option(而不是map)把唯一有趣的情況下,你的模式,並留下case _減小爲None,然後被處理了getOrElse(因此避免寫兩次Map.empty)。

現在要真正回答你的問題,問題是類型推斷和Map的不變性屬性的第一個類型參數。

爲確保所有類型都是您希望的類型,您應該將它們作爲可能需要它們的某些函數的參數。例如,此代碼彙編:

def returnCharSequenceMap(someOtherMap: Option[Map[String, String]]): Map[CharSequence, CharSequence] = { 
    someOtherMap.map[Map[CharSequence, CharSequence]] { _ => 
    Map("a" -> "b") 
    }.getOrElse(Map.empty) 
}