7. Generics Flashcards
Что такое Generics в Java?
Generic - это параметризованные типы. С их помощью можно объявлять классы, интерфейсы и методы, где тип данных указан в виде параметра.
Параметров может быть сколько угодно, работают только с объектами, не с примитивами.
Используя Generic можно создавать классы, которые
автоматически будут работать с разными типами данных.
!!Class class = newClass();не сработает!!
- В отличии от Object Generic не требует явного приведения.
- Можно сделать методы, которые не описаны в классе Object.
- Можно ограничить с помощью
https://neerc.ifmo.ru/wiki/index.php?title=Generics
Где мы можем использовать generics?
- Классы SpaceShip
- Интерфейсы interface Queue
3. Методы форма записи метода: public static T getSomething(T... a){ return a; }
Что такое ограничение типов?
Ограничения позволяют указать базовый класс, которому должен соответствовать параметр.
Для установки ограничения после универсального параметра ставится слово extends, после которого указывается базовый класс ограничения
extends Number - ограничивает возможность приведения типов, все вызываемые объекты должны имплементировать или быть наследниками класса которым ограничен дженерик (должны быть ниже по иерархии классов)
(T extends ClassName & InterfaceName) - сначала класс, затем интерфейсы.
То есть на место параметра T мы можем передать либо класс ClassName, либо один из его классов-наследников и которые реализуют интерфейс InterfaceName.
При этом важно понимать, что поскольку мы установили подобное ограничение, то компилятор будет распознавать объекты типа T как объекты типа ClassName. И в этом случае мы можем вызывать у объектов типа T методы класса ClassName. И мы бы не смогли бы это сделать, если бы мы не задали подобного ограничения.
В качестве ограничений могут выступать и другие обобщения, которые сами могут иметь ограничения:
Что такое wildcard и зачем он нужен?
Wildcard используется когда нам не важен параметр типа.
Upper Bounded Wildcards - extends Number>
Unbounded Wildcards - >
Lower Bounded Wildcards - super Integer>
Можно ли ограничить Wildcard
Upper Bounded Wildcards - extends Number>
Unbounded Wildcards - >
Lower Bounded Wildcards - super Integer>
Используйте extends подстановочный знак, когда вы получаете только значения из структуры.
Используйте super подстановочный знак, когда вы только помещаете значения в структуру.
И не используйте подстановочный знак, когда вы оба хотите получить и поместить из/в структуру.
Что произойдет при перегрузке метода с разными дженериками?
все дженерики превращаются в Object
T ==> Object ==> String
Что происходит с дженериками при компиляции?
Компилятор удаляет всю информацию по generics, проставляя необходимы приведения типов.
если T приводим к String
то при компиляции
типы приводятся как:
T = = > Объект = = > > Строка
Дженерики существуют только до этапа компиляции, после него они удаляются и переходят в вид с явным приведением типов
Что создано для совместимости версий старых jdk
Raw type - это дженерик, использованный без указания типов; в данном случае raw type - это Gen, который вы создаете как просто Gen. Т.к. вы не указываете тип, компилятор обрабатывает этот класс по-другому, “сбрасывая” всю generic-информацию, которую может найти