You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在参数为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:50:30