Здесь есть несколько запутанных ответов, поэтому я попытаюсь прояснить это.
Вы определяете универсальный как таковой:
public class Foo<T> {
private T t;
public void setValue(T t) {
this.t = t;
}
public T getValue() {
return t;
}
}
Если вы хотите, чтобы универсальный элемент в Foo всегда расширял класс Bar, вы должны объявить его так:
public class Foo<T extends Bar> {
private T t;
public void setValue(T t) {
this.t = t;
}
public T getValue() {
return t;
}
}
?
используется при объявлении переменной.
Foo<? extends Bar>foo = getFoo();
OR
DoSomething(List<? extends Bar> listOfBarObjects) {
//internals
}