7. Generics Flashcards

1
Q

Что такое Generics в Java?

A

Generic - это параметризованные типы. С их помощью можно объявлять классы, интерфейсы и методы, где тип данных указан в виде параметра.

Параметров может быть сколько угодно, работают только с объектами, не с примитивами.

Используя Generic можно создавать классы, которые
автоматически будут работать с разными типами данных.

!!Class class = newClass();не сработает!!

  1. В отличии от Object Generic не требует явного приведения.
  2. Можно сделать методы, которые не описаны в классе Object.
  3. Можно ограничить с помощью

https://neerc.ifmo.ru/wiki/index.php?title=Generics

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Где мы можем использовать generics?

A
  1. Классы SpaceShip
  2. Интерфейсы interface Queue
3. Методы
форма записи метода:
public static  T getSomething(T... a){
	return a;
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Что такое ограничение типов?

A

Ограничения позволяют указать базовый класс, которому должен соответствовать параметр.

Для установки ограничения после универсального параметра ставится слово extends, после которого указывается базовый класс ограничения
extends Number - ограничивает возможность приведения типов, все вызываемые объекты должны имплементировать или быть наследниками класса которым ограничен дженерик (должны быть ниже по иерархии классов)

(T extends ClassName & InterfaceName) - сначала класс, затем интерфейсы.

То есть на место параметра T мы можем передать либо класс ClassName, либо один из его классов-наследников и которые реализуют интерфейс InterfaceName.
При этом важно понимать, что поскольку мы установили подобное ограничение, то компилятор будет распознавать объекты типа T как объекты типа ClassName. И в этом случае мы можем вызывать у объектов типа T методы класса ClassName. И мы бы не смогли бы это сделать, если бы мы не задали подобного ограничения.
В качестве ограничений могут выступать и другие обобщения, которые сами могут иметь ограничения:

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое wildcard и зачем он нужен?

A

Wildcard используется когда нам не важен параметр типа.

Upper Bounded Wildcards - extends Number>
Unbounded Wildcards - >
Lower Bounded Wildcards - super Integer>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Можно ли ограничить Wildcard

A

Upper Bounded Wildcards - extends Number>
Unbounded Wildcards - >
Lower Bounded Wildcards - super Integer>

Используйте extends подстановочный знак, когда вы получаете только значения из структуры.

Используйте super подстановочный знак, когда вы только помещаете значения в структуру.

И не используйте подстановочный знак, когда вы оба хотите получить и поместить из/в структуру.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что произойдет при перегрузке метода с разными дженериками?

A

все дженерики превращаются в Object

T ==> Object ==> String

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Что происходит с дженериками при компиляции?

A

Компилятор удаляет всю информацию по generics, проставляя необходимы приведения типов.

если T приводим к String
то при компиляции
типы приводятся как:
T = = > Объект = = > > Строка

Дженерики существуют только до этапа компиляции, после него они удаляются и переходят в вид с явным приведением типов

Что создано для совместимости версий старых jdk

Raw type - это дженерик, использованный без указания типов; в данном случае raw type - это Gen, который вы создаете как просто Gen. Т.к. вы не указываете тип, компилятор обрабатывает этот класс по-другому, “сбрасывая” всю generic-информацию, которую может найти

How well did you know this?
1
Not at all
2
3
4
5
Perfectly