Что происходит в воображаемом классе.
abstract class BaseClass<T extends Number> implements MyInterface<T> {
@Override
public List<T> getList(Number t) {
return null;
}
}
Этот класс имеет один общий параметр (T), который должен расширять класс Number и реализовывать интерфейс MyInterface
Вы также пытаетесь переопределить метод, который не существует, потому что этот класс не расширяет другие классы. В то время как класс реализует интерфейс, нет необходимости переопределять метод интерфейса, потому что это только описание.
Что произойдет, если мы удалим аннотацию @override.
abstract class BaseClass<T extends Number> implements MyInterface<T> {
public List<T> getList(Number t) {
return null;
}
}
В этом случае мы не реализуем метод из интерфейса, но создаем новый. Параметр этого метода имеет значение Number того же типа, что и T, что, вероятно, приведет к некоторой ошибке, связанной с те же методы. (не проверено компилятором)
Их реализация этого метода должна выглядеть следующим образом
abstract class BaseClass<T extends Number> implements MyInterface<T> {
public List<T> getList(T t) { //Because T is allready restricted to be Number
return null;
}
}
А когда вы указываете тип, у вас не возникнет проблем с вызовом этого метода при его переопределении
class ChildClass extends BaseClass<Integer> {
@Override
public List<Integer> getList(Integer t) {
return super.getList(t);
}
}
Заранее Вам не нужно реализовывать это только для возврата null, а затем переопределить его в каком-нибудь дочернем классе. Что вы можете сделать, так это создать класс
abstract class BaseClass<T extends Number> implements MyInterface<T> {
private List<T> list = new ArrayList<T>(); //The way of initialization is up to You
public List<T> getList() { //Because T is allready restricted to be Number
return list;
}
}