需要CharSequence时未编译的字符串的Scala映射

需要CharSequence时未编译的字符串的Scala映射,scala,charsequence,Scala,Charsequence,我试图返回一个映射[CharSequence,CharSequence]。该函数的作用是检查另一个映射是否具有特定的键/值对,然后返回特定的CharSequence映射 如果我只是返回一个空映射(或字符串映射),则编译 def returnCharSequenceMap(someOtherMap: Option[Map[String,String]]): Map[CharSequence, CharSequence] = { Map.empty // or something like

我试图返回一个
映射[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)

[error]found:scala.collection.immutable.Map[_19,String]where type _19>:_1首先,如果不使用
匹配
关键字引入它,就无法在这样的函数中进行模式匹配:您在模式匹配什么

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

当我们进行此操作时,您可以使用
选项上的
collect
方法(而不是
map
)在模式中只放置感兴趣的大小写,并将
大小写减少为
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)
}

首先,如果不使用
match
关键字引入函数,就无法在这样的函数中进行模式匹配:您在做什么模式匹配

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

当我们进行此操作时,您可以使用
选项上的
collect
方法(而不是
map
)在模式中只放置感兴趣的大小写,并将
大小写减少为
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)
}