Нет абсолютно никакой разницы, цель объявления U
состоит в том, чтобы вы могли использовать его:
public static <U extends Number> void doSomething(List<U> list, Consumer<U> sink) {
list.forEach(sink::accept)
}
Это означает, что вас не волнует , что такое U
, но оно должно простираться от Number
. Что вас беспокоит, так это то, что List
содержит тип, совместимый с тем, что может принимать Consumer
.
В качестве альтернативы вы можете использовать U
внутри метода для объявления новых экземпляров универсального типа:
public static <U extends Number> List<U> copy(List<U> list) {
List<U> copy = new ArrayList<>();
copy.addAll(list)
return copy;
}
да, я знаю, есть более аккуратные способы сделать это - пожалуйста, отнеситесь к этому как иллюстративный пример