scala – 类型匹配在Map上失败
发布时间:2020-12-16 18:06:04 所属栏目:安全 来源:网络整理
导读:我正在学习 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) }} 我收到警告
我正在学习
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]< ;: 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[_,_] => ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |