Сегодня я наткнулся на что-то интересное. Предположим, что следующий класс Java 6:
public class Ereasure {
public Object get(Object o) {
return null; // dummy
}
public static class Derived<T> extends Ereasure{
// (1)
@Override
public Object get(T o) {
return super.get(o);
}
// (2)
/*
@Override
public Object get(Object o) {
return super.get(o);
}*/
}
}
Если вы попытаетесь скомпилировать приведенный выше пример, компилятор говорит Ereasure.java:9: метод не переопределяет или не реализует метод из супертипа @Override Если вы удалите аннотацию @Override (которая не должна быть необходимой!), Это говорит Ereasure.java:8: имя clash: get (T) в Ereasure.Derived и get (java.lang.Object) в Ereasure имеют одно и то же стирание, но не переопределяют другое Это немного противоречиво, так как T должен erease Object и поэтому переопределять метод родительских классов get.
Если вы оставите (1) unannotated и uncomment (2), так что (1) перегрузки (2) это тоже не сработает. Выход компилятора:
Ereasure.java:15: get(T) is already defined in Ereasure.Derived
public Object get(Object o) {
Как вывод, T убирается Object, но не может переопределить родительский метод get.
Теперь мой вопрос: почему dooes не по крайней мере один из примеров компилируется?