当需要 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)
}
我正在尝试 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)
}