为什么asInstanceOf不会抛出ClassCastException?
scala> List("a").asInstanceOf[List[Int]]
res34: List[Int] = List(a)
答案 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