2017-04-02 5 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]]ではありません。

我々はそれに取り組んでいる一方で、あなたがに対処するために、その後、あなたのパターンで唯一の興味深いケースを入れ、Noneとして削減することがcase _を残すために(代わりにmapの)Optioncollectメソッドを使用することができますgetOrElse(したがって、Map.emptyを2回書くことは避けてください)。

あなたの質問に本当に答えるには、タイプ推論と不変プロパティーの最初の型パラメーターにMapという問題があります。

すべての型が必要なものであることを確認するには、それらを必要とする可能性のある関数のパラメータとしてパラメータとして渡す必要があります。たとえば、次のコードをコンパイルします。

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