Почему нельзя использовать <T super Number> в Generics?

250
12 января 2017, 04:29

Я хочу ограничить тип, передаваемый в метод, в качестве параметра снизу:

public <T super Number> void fill(T list) {}

Но IDEA мне подчеркивает, что так делать нельзя.

Хотя когда я делаю такое же ограничение сверху вот так:

public <T extends Number> void fill(T list) {}

То всё нормально работает.

В чем разница? Почему сверху я ограничение выставить могу, а такое же снизу выставить не получается? Как мне добиться нужного эффекта, используя именно <T ... >, а не <? ... >?

Answer 1

Если мы пишем <T super Number>, то тип T у нас может быть любым в иерархии наследования класса Number. Притом, что мы об этих классах не знаем ничего, кроме как того, что они наследуются от Object. Соотвественно, вызвать какие то методы напрямую у объекта типа T у нас не получится.

Ситуация с <T extends Number> противоположная. Мы все еще понятия не имеем какой это класс T, но абсолютно точно знаем, что у него есть методы, которые определены в классе Number, т.к. класс наледуется от Number.

Следовательно, конструкция вида <T super Number> является бессмысленной. Основной профит ее использования, это применение с параметризированными классами, например List<? super Number>

READ ALSO
Возможно ли изменить интерфейс звонка?

Возможно ли изменить интерфейс звонка?

Хотел изменить интерфейс страницы набора номера и звонкаПерерыл везде, нигде об этом не говорится или не правильно искал

296
Различия между extend и super в Generics

Различия между extend и super в Generics

Для примера такой код:

295
API facebook, token, Java, Spring

API facebook, token, Java, Spring

В каком виде приходит ответ от facebook, после отправки запроса

278
Как загрузить содержимое txt файла в TableView?

Как загрузить содержимое txt файла в TableView?

Имеется файл txt с содержимым, как сделать так что бы содержимое этого файла отображалось в таблице (tableView)?

451