繁体   English   中英

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

[英]Scala type erasure in pattern matching Map[String, Any]

我使用的是 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")
}

匹配将成功并打印地图。 在第二种情况下, 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")
}

在 Scala 编程中进行了解释

第一次收到警告,因为 d 被强制为 Any 类型。 第二次编译器将 e 的类型推断为 Map[String, Int],这是模式匹配的第一种情况表达式。 编译器在编译时知道类型,因此无需警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM