已实例化为子类的超类类型变量能否调用子类独有方法?
问题原因
你遇到的编译错误确实是userInteraction方法中newObject的*编译时类型为超类a*导致的。Java作为静态类型语言,编译器只会根据变量的声明类型校验可调用的方法,超类a中没有定义customMethodB、customMethodC方法,因此直接调用会直接报错,和运行时实际指向的子类实例无关。
可行实现方案
以下方案都不需要额外编写接收具体子类类型参数的方法:
方案1:向下转型(无需修改原有类结构)
先校验实例类型再向下转型为对应子类,即可调用子类独有方法:userInteraction(a newObject, String userChoice){ if (userChoice.equals("b") && newObject instanceof b){ ((b) newObject).customMethodB(); } else if (userChoice.equals("c") && newObject instanceof c){ ((c) newObject).customMethodC(); } }若使用Java 16及以上版本,可通过模式匹配简化强转逻辑:
userInteraction(a newObject, String userChoice){ if (userChoice.equals("b") && newObject instanceof b objB){ objB.customMethodB(); } else if (userChoice.equals("c") && newObject instanceof c objC){ objC.customMethodC(); } }方案2:多态重构(符合面向对象设计规范,推荐)
如果可以修改超类和子类的代码,优先通过多态实现,无需任何类型判断:- 给超类
a添加公共抽象方法(若a不能定义为抽象类,也可写空实现的普通方法):
public abstract class a{ public a(){} public abstract void customAction(); }- 子类
b重写该方法,内部调用原有customMethodB逻辑:
public class b extends a{ public b(){super();} public void customMethodB(){} @Override public void customAction(){ customMethodB(); } }- 子类
c同理重写方法:
public class c extends a{ public c(){super();} public void customMethodC(){} @Override public void customAction(){ customMethodC(); } }- 最终
userInteraction方法可简化为:
userInteraction(a newObject, String userChoice){ newObject.customAction(); }运行时会自动匹配对应子类的实现逻辑。
- 给超类
方案3:反射实现(仅适用于无法修改原有类代码的特殊场景,不推荐)
通过反射可绕过编译期类型检查直接调用子类方法,但性能较低、容错性差,无特殊需求不建议使用。
内容的提问来源于stack exchange,提问作者Aleksandar
相关产品推荐
相关产品推荐

