Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

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

#java #generics


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

public  void fill(T list) {}


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

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

public  void fill(T list) {}


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

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


Ответы

Ответ 1



Если мы пишем , то тип T у нас может быть любым в иерархии наследования класса Number. Притом, что мы об этих классах не знаем ничего, кроме как того, что они наследуются от Object. Соотвественно, вызвать какие то методы напрямую у объекта типа T у нас не получится. Ситуация с противоположная. Мы все еще понятия не имеем какой это класс T, но абсолютно точно знаем, что у него есть методы, которые определены в классе Number, т.к. класс наледуется от Number. Следовательно, конструкция вида является бессмысленной. Основной профит ее использования, это применение с параметризированными классами, например List

Ответ 2



Соотвественно, вызвать какие то методы напрямую у объекта типа T у нас не получится. Методы вызвать не получится, а вот если мы допустим захотим сделать приведение типов? К примеру такой метод написать T getFirst(List list) { return (T) list.get(0); } что в этом плохого?

Комментариев нет:

Отправить комментарий