向下转型前必须用 instanceof 判断,否则运行时极大概率抛 ClassCastException;Java 8+ 应在 if 块内完成判断与转换,Java 14+ 推荐模式匹配语法 if (obj instanceof Dog dog),Java 21+ 支持 switch 类型模式。

向下转型前必须用 instanceof 判断,否则运行时极大概率抛 ClassCastException。核心就一条:先确认对象“确实是”目标子类,再转换——instanceof 是唯一轻量、可靠、JVM 原生支持的守门员。
为什么不能跳过 instanceof 直接强转
父类引用(如 Animal a)在编译期只知道公共方法,JVM 不会在编译时验证它实际指向哪个子类。如果直接写 (Dog) a:
- 当
a = new Cat()时,运行时报错:ClassCastException: Cat cannot be cast to Dog - 当
a = null时,同样崩溃(NullPointerException或后续空指针) -
instanceof对null返回false,天然规避空值风险,无需额外判空
标准安全写法(Java 8+ 通用)
判断和转换必须在同一个 if 块内完成,变量作用域严格受限:
- ✅ 正确:
if (obj instanceof Dog) {<br> Dog dog = (Dog) obj;<br> dog.bark();<br>} - ❌ 错误:
if (obj instanceof Dog) { /* 没转换 */ }<br>Dog dog = (Dog) obj; // 危险!此时 obj 可能不是 Dog - ❌ 错误:
Dog dog = (Dog) obj; // 没判断,纯靠运气
Java 14+ 推荐:模式匹配一步到位
语法更简洁,语义更安全,变量自动绑定且仅在块内有效:
立即学习“Java免费学习笔记(深入)”;
if (obj instanceof Dog dog) {<br> dog.bark(); // dog 已是非空 Dog 实例,类型由编译器保障<br>}- 支持连写业务条件:
if (obj instanceof Dog dog && dog.isTrained()) { ... } - 不支持泛型类型:
obj instanceof List<String> list编译失败,只能写obj instanceof List list
多个子类分支怎么组织
避免长串 if 堆砌,保持逻辑清晰可维护:
- 用
else if链覆盖所有已知子类,互斥执行:if (item instanceof Equipment e) { ... }<br>else if (item instanceof Product p) { ... }<br>else { log.warn("未知类型: {}", item.getClass().getName()); } - 分支超过 4 个时,考虑策略模式或
Map<Class<?>, Consumer<Item>>注册分发 - Java 21+ 可用
switch类型模式:switch (obj) {<br> case String s -> System.out.println(s.length());<br> case Integer i -> System.out.println(i);<br> default -> System.out.println("other");<br>}


















