Почему отражение возвращает два метода, когда есть только одна реализация?

Предположим, что у меня есть этот код:

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 касается методов, у них есть имя, последовательность сырых типизированных параметров и возврат типа raw. Вы можете перегрузить тип возврата в байт-код.

A System.err.println(mehtod.getReturnType()); должен дать вам разные результаты для двух методов.