为什么asInstanceOf不会抛出ClassCastException?

时间:2014-09-28 20:35:50

标签: scala type-safety

为什么asInstanceOf不会抛出ClassCastException?

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

1 个答案:

答案 0 :(得分:17)

来自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