多态下父类引用调用子类特有方法需类型检查与转换:①用instanceof判断后强制转型;②在父类定义抽象/default方法实现扩展;③用访问者模式解耦操作与类型;④借助泛型+class参数获取运行时类型信息。

在多态环境下,父类引用指向子类对象时,编译器只允许调用父类中声明过的方法。若想调用子类特有的方法,必须先明确类型归属,再安全地展开访问。
使用 instanceof 判断类型后强制转换
这是最常用且直观的方式:先确认对象实际属于哪个子类,再转为对应类型调用其特有方法。
- 确保运行时类型匹配,避免 ClassCastException
- 转换前必须用 instanceof 检查,尤其当集合中混存多种子类对象时
- 示例:if (obj instanceof Dog) { ((Dog) obj).bark(); }
在父类中定义抽象/默认方法(推荐面向接口设计)
提前规划扩展能力,把子类差异点抽象成方法契约,由子类实现或提供默认行为。
- 抽象方法强制子类实现,适合每个子类逻辑完全不同
- default 方法可提供通用逻辑,子类选择性重写,减少冗余判断
- 比频繁转型更符合开闭原则,也利于后续新增子类
使用访问者模式解耦操作与类型
当需要对多种子类执行不同但相关的操作(如序列化、渲染、校验),访问者模式能将算法从对象结构中分离出来。
- 每个子类实现 accept(Visitor) 方法,把调用权交给访问者
- 访问者内部按具体类型分发逻辑,避免外部大量 instanceof
- 适合业务规则复杂、子类多且操作维度多的场景
借助泛型 + 类类型参数获取运行时信息
在工具类或工厂中,通过传入 Class
- 适用于需统一处理某类子对象的场景,如配置加载、反射调用
- 配合 getDeclaredMethod 或 invoke 使用,增强灵活性
- 注意泛型擦除问题,Class 参数是绕过擦除的关键








