ClassCastException发生在运行时,当编译通过但实际对象类型与目标类型不兼容时;例如Parent p = new ChildA()后执行(ChildB) p会抛出该异常。
Java 多态中强制类型转换异常(ClassCastException)只会在运行时发生,前提是编译通过但实际对象类型与目标类型不兼容。比如用 Parent p = new ChildA(); 后执行 (ChildB) p,就会抛出该异常——因为 p 实际是 ChildA 实例,无法转成无关的 ChildB。
核心原则:先用 instanceof 检查再转型。这是最常用、最直接的防护手段,避免盲目强转。
instanceof 在 Java 14+ 支持模式匹配(如 if (obj instanceof Child c)),自动完成检查+赋值,但需确认 JDK 版本null 不会触发 instanceof 异常,结果为 false,所以无需额外判空instanceof 判
obj instanceof Runnable
if (obj instanceof Dog) {
Dog dog = (Dog) obj; // 安全
dog.bark();
}
捕获 ClassCastException 属于反模式。它掩盖了设计或逻辑问题,而不是解决问题本身。
泛型在运行时被擦除,List 和 List 运行时都是 List,所以 (List 编译能过,但若实际是 ArrayList,后续取元素时才会在 get() 抛 ClassCastException——这个异常位置和转型位置不一致,排查更难。
TypedContainer),或改用 Class 参数显式传入类型Objects.requireNonNull() 或断言辅助验证,但不能替代类型检查