15

假设我有这个代码:

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

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

4

1 回答 1

8

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

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

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

于 2013-05-03T14:10:40.737 回答