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

时间:2013-05-03 14:08:55

标签: java generics inheritance reflection

假设我有这段代码:

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++;
    }
}

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

1 个答案:

答案 0 :(得分:8)

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

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

System.err.println(mehtod.getReturnType());应该为这两种方法提供不同的结果。