Java中无需强转Object即可调用多类共享draw方法的实现方式
Java实现统一调用不同类的draw方法方案
核心解决方案:利用多态(接口/抽象类)
Java是静态类型语言,要实现统一调用不同类的同名方法,必须通过**抽象出公共的父类型(接口或抽象类)**来实现多态,这是最规范且可扩展的方式。
步骤1:定义公共接口
创建一个包含draw方法的接口,让所有相关类都实现它:
public interface SolarObject { // 这里的System参数类型请和你代码中的保持一致 void draw(System system); }
步骤2:让所有类实现该接口
修改Star、Planet、Moon类,实现SolarObject接口并实现draw方法:
public class Star implements SolarObject { @Override public void draw(System system) { // Star类原有的draw逻辑 } } public class Planet implements SolarObject { @Override public void draw(System system) { // Planet类原有的draw逻辑 } } public class Moon implements SolarObject { @Override public void draw(System system) { // Moon类原有的draw逻辑 } }
步骤3:修改集合类型并调用
将存储对象的集合类型从List<Object>改为List<SolarObject>,这样取出的元素直接是SolarObject类型,无需强转即可调用draw:
SolarObject solarObject = solarObjects.get(i); solarObject.draw(system);
特殊场景处理(无法修改集合类型)
如果因为历史代码限制,无法修改集合的泛型类型,可通过一次类型转换实现统一调用(比原有的多个if判断更简洁):
Object solarObject = solarObjects.get(i); if (solarObject instanceof SolarObject) { ((SolarObject) solarObject).draw(system); }
为什么你的尝试失败?
你写的solarObject.getClass().cast(solarObject).draw(system)编译报错,原因是:
Java编译时需要确定调用的方法存在,而getClass().cast()返回的对象类型在编译阶段是未知的(仅运行时确定),编译器无法确认该类型包含draw方法,因此报错。
内容的提问来源于stack exchange,提问作者A Person
相关产品推荐
相关产品推荐

