"2", "3" -> 4) d match { case -6ren">
gpt4 book ai didi

模式匹配 Map[String, Any] 中的 Scala 类型删除

转载 作者:行者123 更新时间:2023-12-02 18:21:37 25 4
gpt4 key购买 nike

我使用的是 scala 版本 2.12.3,当我在控制台代码中测试某些模式匹配时:

val d: Any = Map("1" -> "2", "3" -> 4)
d match {
case map: Map[String, Any] => println(map)
case _ => println("should not be here")
}

我收到一些警告,例如 <console>:14: warning: non-variable type argument String in type pattern scala.collection.immutable.Map[String,Any] (the underlying of Map[String,Any]) is unchecked since it is eliminated by erasure .

我在谷歌上搜索了这个警告,几乎所有的答案都告诉我,scala运行时会在进行模式匹配时删除类型,并且回答这个问题似乎是合理的,但是当我使用以下代码时:

val e = Map("1" -> "2", "3" -> 4)
e match {
case map: Map[String, Any] => println(map)
case _ => println("should not be here")
}

没有关于类型删除的警告,那么这两种模式匹配有什么区别,请解释什么时候会发生类型删除,谢谢!

最佳答案

匹配 : Map[String, Any] 的问题在于,实际上只能在运行时检查您是否有 Map 。所以例如

val d: Any = Map(0 -> 0)
d match {
case map: Map[String, Any] => println(map)
case _ => println("should not be here")
}

匹配成功并打印 map 。在第二种情况下,e 的静态类型已经是 Map[String, Any]。因此编译器“知道”您无法获取任何其他类型的 Map 并且没有需要警告的问题。

但是类型删除仍然发生。这意味着您实际上可以e中获得除Map[String, Any]之外的其他东西,但只能通过对编译器撒谎来获得以某种方式或忽略其他警告。在这种情况下,匹配仍然成功。例如

val e = Map(0 -> 0).asInstanceOf[Map[String, Any]]
e match {
case map: Map[String, Any] => println(map)
case _ => println("should not be here")
}

关于模式匹配 Map[String, Any] 中的 Scala 类型删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47030275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com