如何在参数为Class<? extends Human>的方法中访问子类Getter/Setter?
解决子类独有Getter/Setter的访问问题
首先要指出你代码里的核心错误:printDistinct方法的参数是Class<? extends Human>——这是类的字节码对象,不是Human的实例,所以直接调用human.getAge()肯定会报错,因为Class类并没有getAge()方法。下面分场景给出具体解决方案:
场景1:方法接收的是Human子类实例
如果你的方法是要处理已经创建好的Human子类对象,把参数改成Human类型,通过instanceof判断具体子类类型,强转后调用独有方法:
public void printDistinct(Human human) { // 父类公共方法直接调用 Integer age = human.getAge(); // 判断是Adult子类,强转后调用getJob() if (human instanceof Adult) { Adult adult = (Adult) human; String job = adult.getJob(); System.out.println("职业:" + job); } // 判断是Child子类,强转后调用getSchool() else if (human instanceof Child) { Child child = (Child) human; String school = child.getSchool(); System.out.println("学校:" + school); } }
场景2:方法接收的是Class对象(需动态实例化)
如果确实需要传入Class<? extends Human>(比如要动态创建实例),先实例化对象,再通过类型判断强转:
public void printDistinct(Class<? extends Human> humanClass) throws InstantiationException, IllegalAccessException { // 实例化对象 Human human = humanClass.newInstance(); Integer age = human.getAge(); // 判断Class对象是否为Adult的子类 if (Adult.class.isAssignableFrom(humanClass)) { Adult adult = (Adult) human; String job = adult.getJob(); System.out.println(job); } // 判断Class对象是否为Child的子类 else if (Child.class.isAssignableFrom(humanClass)) { Child child = (Child) human; String school = child.getSchool(); System.out.println(school); } }
更优雅的方案:利用多态(推荐)
上面的强转方式不够优雅,且新增子类时需要修改printDistinct方法。可以在父类定义抽象方法,子类实现各自的逻辑,完全符合面向对象的多态原则:
修改父类为抽象类,添加抽象方法
public abstract class Human { Integer age; Integer height; public Integer getAge() {return age;} public Integer getHeight() {return height;} // 定义抽象方法,子类实现返回各自的独有信息 public abstract String getDistinctInfo(); }
子类实现抽象方法
public class Child extends Human { String school; public String getSchool() {return school;} @Override public String getDistinctInfo() { return this.school; } } public class Adult extends Human { String job; public String getJob() {return job;} @Override public String getDistinctInfo() { return this.job; } }
调用时无需强转,直接通过父类引用调用
public void printDistinct(Human human) { Integer age = human.getAge(); // 直接调用抽象方法,子类会自动执行对应逻辑 String distinctInfo = human.getDistinctInfo(); System.out.println(distinctInfo); }
这种方式的好处是:新增子类时,只需要实现getDistinctInfo()方法,不需要修改printDistinct的代码,扩展性更强。
内容的提问来源于stack exchange,提问作者bao le
相关产品推荐
相关产品推荐

