当需要 CharSequence 时,字符串的 Scala 映射不编译

Scala Map of Strings not Compiling When CharSequence is expected

我正在尝试 return Map[CharSequence, CharSequence]。该函数的要点是检查另一个映射是否具有特定的 key/value 对,然后是 return 特定的 CharSequence 映射。

如果我只是 return 一个空映射(或字符串映射),这编译

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)

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

首先,如果不使用 match 关键字引入它,就不能在这样的函数内部进行模式匹配:你在进行模式匹配吗?

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

类型的参数

当我们这样做时,您可以在 Option(而不是 map)上使用 collect 方法,只将有趣的案例放入您的模式中,并保留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)
}