scala – 类型匹配在Map上失败

前端之家收集整理的这篇文章主要介绍了scala – 类型匹配在Map上失败前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在学习 Scala并尝试编写一些简单的代码.

当我尝试编写这样的方法时:

def func(value: Any) {
  value match {
    case i: Int => println(1)
    case vector: Vector[Any] => println(2)
    case map: Map[Any,Any] => println(3)
    case _ => println(4)
  }
}

我收到警告:

[warn]........:31: non-variable type argument Any in type pattern scala.collection.immutable.Map[Any,Any] (the underlying of Map[Any,Any]) is unchecked since it is eliminated by erasure
[warn]       case map: Map[Any,Any] => println(3)
[warn]                    ^
[warn] one warning found

我想知道为什么使用Map [A​​ny,Any]会得到这个警告,但Vector [Any]不会.

解决方法

问题是Map [X,Y]在其类型参数X中不是协变的(但是Vector [X]是).

那是什么意思?假设B<:A(读,B是A的子类型). 然后我们有Vector [B]<:Vector [A].这是有道理的:如果我们从Vector [B]中检索元素x,它将是一个B.这意味着它也是一个由子类型关系组成的A. (类似的论点适用于所有其他方法.) 按照类似的推理,对于所有X,Map [X,B]<:Map [X,A](元素检索是按键而不是索引,但要点保持不变). 但是,这不适用于Map的第一个类型参数.假设某些X的Map [B,X]&lt ;: Map [A​​,X]. 我们现在可以执行以下操作:

val x: Map[B,X] = ???
x.get(b: B) // makes sense

val y: Map[A,X] = x // must be ok,Map[B,X] <: Map[A,X]
y.get(a: A) // bad! x doesn't know how to "get" with something of type `A`

因此,Map [_,_]不一定是Map [A​​ny,Any].要修复错误消息,请使用:

case map: Map[_,_] => ...

猜你在找的Scala相关文章