为什么反射返回两个方法,而只有一个实现?

2022-09-03 15:42:45

假设我有这个代码:

public interface Address {
    public int getNo();
}

public interface User<T extends Address> {
    public String getUsername();
    public T getAddress();    
}

public class AddressImpl implements Address {
    private int no;
    public int getNo() {
        return no;
    }
    public void setNo(int no) {
        this.no = no;
    }
}

public class UserImpl implements User<AddressImpl> {
    private String username;
    private AddressImpl addressImpl;

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }

    public AddressImpl getAddress() {
        return addressImpl;
    }

    public void setAddress(AddressImpl addressImpl) {
        this.addressImpl = addressImpl;
    }
}

运行代码:

int getAddressMethodCount = 0;
for (Method method : UserImpl.class.getMethods()) {
    if (method.getName().startsWith("getAddress")) {
        getAddressMethodCount++;
    }
}

变量将产生 2;为什么会这样?getAddressMethodCount


答案 1

这是实现协变返回类型的方式。 会比反思更方便地向您展示。javap -private

带有 的子类具有处理转发到更具体方法的合成桥接方法。就JVM而言,方法有一个名称,一系列原始类型参数和一个原始类型返回。您可以在字节码中返回类型时重载。

对于这两种方法,A 应该会给出不同的结果。System.err.println(mehtod.getReturnType());


答案 2

推荐