向下转型必须先用 instanceof 校验类型,否则运行时抛 ClassCastException;应优先用多态替代强转,Java 14+ 支持 instanceof 模式匹配简化代码。

父类引用转子类不是语法错误,而是运行时风险点——关键不在“能不能写”,而在“对象到底是不是那个子类”。盲目强转必然触发 ClassCastException,真正可靠的解法是把类型判断前置、把转换逻辑显式化、把失败路径提前设计好。
向下转型前必须做 instanceof 类型校验
父类引用指向的对象,运行时可能是任意子类实例,也可能是父类本身。不做检查就强转,等于赌运气。
- 正确写法:先用 instanceof 判断再转换,确保安全
- 错误写法:
Child child = (Child) parent;—— 一旦 parent 实际是 new Parent(),立刻崩溃 - 注意:instanceof 对 null 返回 false,无需额外判空;但若目标类型为 final 类(如 String),JVM 可能优化掉部分检查
泛型集合中取元素时,类型擦除是隐形陷阱
ArrayList<Object> 或原始类型 List 无法在运行时保留元素真实类型,从里面取出来的 Object,不能直接当某个具体子类用。
- 避免原始集合:
List list = new ArrayList();→ 改用List<Dog> dogs = new ArrayList<>(); - 若必须用 Object 集合(如对接旧 API),取出后务必 instanceof + 强转 两步走
- 示例:
if (obj instanceof Dog) { Dog d = (Dog) obj; d.bark(); }
用多态替代强转,从设计上减少转型需求
频繁向下转型往往暴露了设计问题。如果业务逻辑总要区分“到底是哪个子类”,说明本该由子类自己实现的方法,被不合理地抽到了父类里。
- 把差异行为定义为父类抽象方法,让每个子类自行实现
- 用访问者模式、策略模式等解耦类型判断逻辑
- 例如:不用
if (animal instanceof Dog)去调bark(),而是直接animal.makeSound(),由 Dog 重写该方法
Java 14+ 可用模式匹配简化转型代码
传统写法需要两行(instanceof + 强转),Java 14 起支持 instanceof 模式匹配,一行搞定且自动绑定变量。
- 老写法:
if (obj instanceof Dog) { Dog d = (Dog) obj; d.bark(); } - 新模式:
if (obj instanceof Dog d) { d.bark(); }—— d 已是强转后的 Dog 实例 - 注意:需开启 --enable-preview(Java 14/15),Java 16+ 默认启用

















