为什么asInstanceOf不会抛出ClassCastException?

Yan*_*san 16 scala type-safety

为什么asInstanceOf不会抛出ClassCastException?

scala> List("a").asInstanceOf[List[Int]]
res34: List[Int] = List(a)
Run Code Online (Sandbox Code Playgroud)

End*_*Neu 18

来自scaladoc:

请注意,演员在运行时的成功是以Scala的擦除语义为模.因此,表达式1.asInstanceOf [String]将在运行时抛出ClassCastException,而表达式List(1).asInstanceOf [List [String]]则不会.在后一个示例中,因为类型参数作为编译的一部分被擦除,所以不可能检查列表的内容是否是所请求的类型.

如果您尝试访问变量或映射转换,则correclty会抛出异常:

scala> List("a").asInstanceOf[List[Int]]
res0: List[Int] = List(a)

scala> res0
res1: List[Int] = List(a)

scala> res0(0)
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

List("a").map(_.asInstanceOf[Int])
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
Run Code Online (Sandbox Code Playgroud)