Java中如何通过基类对象调用子类方法?
解决子类继承BaseEntity时的通用属性获取问题
现有代码结构
基类实体
public class BaseEntity{ Integer id; //setter getters etc }
子类实体
public class MyChild extends BaseEntity{ String name; //setter getters etc }
待优化的工具类
public class Util{ public String getName(BaseEntity base){ return base != null ? base.getChild().getName() : ""; } }
当前工具类依赖组合关系的getChild()方法,但实际子类是继承BaseEntity而非组合,下面提供几种无需组合的解决方案,优先级从高到低:
方案一:基类定义抽象方法(面向对象最优解)
如果所有子类都包含name属性,直接在基类中定义抽象的getName()方法,强制子类实现:
public abstract class BaseEntity{ Integer id; // setter、getter for id public abstract String getName(); }
子类实现该方法:
public class MyChild extends BaseEntity{ String name; @Override public String getName(){ return this.name; } // setter、getter etc }
工具类可以直接简化为:
public class Util{ public String getName(BaseEntity base){ return base != null ? base.getName() : ""; } }
这种方案利用多态特性,代码简洁且类型安全,完全符合面向对象设计原则。
方案二:泛型+函数式接口(灵活适配多子类)
如果无法修改基类,或者不是所有子类都有name属性,可以用泛型结合函数式接口实现通用方法:
import java.util.function.Function; public class Util{ // 针对单一子类的类型判断实现 public String getName(BaseEntity base){ if(base == null){ return ""; } if(base instanceof MyChild){ return ((MyChild)base).getName(); } // 其他子类可在此添加判断逻辑 return ""; } // 通用泛型方法,适配任意子类的任意属性 public <T extends BaseEntity> String getProperty(T entity, Function<T, String> getter){ return entity != null ? getter.apply(entity) : ""; } }
使用示例:
Util util = new Util(); MyChild child = new MyChild(); child.setName("Demo"); // 方式1:调用针对MyChild的方法 String name1 = util.getName(child); // 方式2:通用方法,可适配任何子类的任意属性 String name2 = util.getProperty(child, MyChild::getName);
该方案无反射开销,编译期类型安全,通用方法可以灵活处理不同子类的不同属性,避免重复编写样板代码。
方案三:反射(兜底方案)
如果以上两种方案都无法实现,反射可以作为最后选择,但要注意性能和编译期安全问题:
import java.lang.reflect.Method; public class Util{ public String getName(BaseEntity base){ if(base == null){ return ""; } try{ Method getNameMethod = base.getClass().getMethod("getName"); return (String) getNameMethod.invoke(base); } catch(Exception e){ // 处理方法不存在、权限异常等情况 return ""; } } }
反射会带来一定性能损耗,且无法在编译期校验方法是否存在,仅建议在无法修改基类且子类数量极多的场景下使用。
内容的提问来源于stack exchange,提问作者Mohammadreza Khatami
相关产品推荐
相关产品推荐

