2017-04-02 71 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) 
}