我正在学习
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 [Any,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]< ;: 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 [Any,Any].要修复错误消息,请使用:
case map: Map[_,_] => ...