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