Сегодня я наткнулся на что-то интересное.Предположим, что следующий класс 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: name clash: get (T) в Ereasure.Derived и get (java.lang.Object) в Ereasure имеют одинаковое стирание, но нипереопределяет другие. Это немного противоречиво, поскольку T должен уменьшиться до Object и для этого переопределить родительский класс get.
Если вы оставите (1) без комментариев и раскомментируйте (2), так (1) перегрузит (2)это тоже не сработает.Вывод компилятора:
Ereasure.java:15: get(T) is already defined in Ereasure.Derived
public Object get(Object o) {
В заключение, T уменьшается до Object, но не может переопределить родительский метод get.
Теперь у меня вопрос, почему не хотя бы один изпримеры компилируются?