加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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]&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[_,_] => ...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读