Java集合统一处理子类对象的关键是用父类或接口类型声明泛型集合,如List或List,依托继承/实现关系实现运行时多态;不能混存无关类型,否则丧失多态意义。

Java 中在集合框架中统一处理不同子类对象,关键不是“存什么类型”,而是“用什么类型声明”——必须基于继承或实现关系,用父类或接口类型作为集合的泛型参数,才能实现运行时多态调用。
用父类或接口声明集合,实际存入子类实例
这是统一处理的前提。编译器只认声明类型的方法,但 JVM 在运行时会根据实际对象类型调用对应重写的方法。
- 定义抽象类 Animal,含抽象方法
makeSound() - 子类 Dog 和 Cat 分别重写该方法
- 声明:
List<animal> animals = new ArrayList();</animal> - 添加:
animals.add(new Dog()); animals.add(new Cat()); - 遍历时直接调用:
animal.makeSound(),无需 if-else 判断类型
优先用接口,提升扩展性和解耦度
接口比抽象类更灵活,适合行为契约明确、无共用状态的场景。新增子类只需实现接口,原有集合操作逻辑完全不用改。
- 定义接口 Drawable,含
draw()方法 - Circle、Text、Triangle 各自实现
- 集合声明为:
List<drawable> shapes = new ArrayList();</drawable> - 后续新增
shapes.add(new Triangle());,遍历代码一行不需动
不能直接调用子类特有方法,需安全转型
集合以父类/接口类型声明,意味着编译期只暴露其定义的方法。若要使用子类独有功能(如 Dog.fetchBall()),必须先判断类型再强制转换。
立即学习“Java免费学习笔记(深入)”;
-
animals.get(0).fetchBall();编译失败 —— Animal 类型没有该方法 - 正确做法:
if (animals.get(0) instanceof Dog) { ((Dog) animals.get(0)).fetchBall(); } - 推荐配合泛型通配符或 Visitor 模式规避频繁转型,尤其在复杂业务中
避免混存无关类型,守住多态边界
统一处理 ≠ 任意混存。把 String、Integer、Dog 全塞进 List<object></object> 不是多态,是类型失控。它失去编译检查,也丧失方法调用的确定性。
- 真正多态要求:所有元素必须属于同一继承体系,或共同实现同一接口
- 例如
List<number></number>可存Integer、Double,因为它们都继承自 Number - 而
List<object></object>虽语法合法,但无法统一调用有意义的行为方法


















