当预期CharSequence时,不编译的字符串的Scala映射

时间:2017-04-02 21:33:09

标签: scala charsequence

我试图返回Map[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)

有人可以帮助指出我做错了什么吗?我试图理解为什么我不能返回地图。谢谢!

1 个答案:

答案 0 :(得分:2)

首先,你不能在这样的函数中进行模式匹配,而不用match关键字引入它:你在模式匹配上做什么?

然后,假设您想在mapRecord上进行模式匹配(在这种情况下,您可以简单地删除mapRecord =>,因为函数可以作为其参数的模式匹配给出)请注意它将永远不会匹配,因为map中的函数采用Map[String, String]类型的参数,而不是类型Option[Map[String, String]]的参数。

虽然我们正在使用它,但您可以使用collect上的Option方法(而非map)在您的模式中仅添加有趣的案例,并保留{{ 1}}缩小为case _,然后在None处理(从而避免两次写getOrElse。)

现在要真正回答你的问题,问题在于类型推断和Map.empty在其第一个类型参数上的不变性属性。

为了确保所有类型都是您想要的类型,您应该将它们作为参数放到可能需要它们的某些函数中。例如,此代码编译:

Map