Generics (Java)

Содержание

Слайд 2

Generics Обобщенные: типы (generic types) классы (без enum, исключений, анонимных!) интерфейсы

Generics

Обобщенные:
типы (generic types)
классы (без enum, исключений, анонимных!)
интерфейсы (без аннотаций!)
методы (generic methods)
конструкторы

(generic constructors)
Пример generics – Collection framework из состава Java core.

Kolesnikov D.O. SED KNURE

Слайд 3

Предназначение Контейнеры гетерогенные гомогенные Параметризация типов методов конструкторов Kolesnikov D.O. SED KNURE

Предназначение

Контейнеры
гетерогенные
гомогенные
Параметризация
типов
методов
конструкторов

Kolesnikov D.O. SED

KNURE
Слайд 4

Преимущества Определение ошибок использования типов на этапе компиляции. Использование параметризованных типов

Преимущества

Определение ошибок использования типов на этапе компиляции.
Использование параметризованных
типов

методов
конструкторов
Использование wildcards
с ограничениями
без ограничений

Kolesnikov D.O. SED KNURE

Слайд 5

Терминология Generic: class A {…} класс public A() {…} конструктор public

Терминология

Generic:
class A {…} класс
public A() {…} конструктор
public T m(T t) {…}

метод
T – параметр generic-а

Kolesnikov D.O. SED KNURE

Слайд 6

Параметризация Подстановка вместо параметра конкретного значения при использовании generic: Параметризованный класс:

Параметризация

Подстановка вместо параметра конкретного значения при использовании generic:
Параметризованный класс:
A a =

new A();

Kolesnikov D.O. SED KNURE

Слайд 7

Байт код параметризованных generic-ов Один байт код на все варианты конкретных

Байт код параметризованных generic-ов
Один байт код на все варианты конкретных значений

параметра.

Kolesnikov D.O. SED KNURE

Слайд 8

Сырой тип (raw type) Использование generic без значения параметра Generic класс:

Сырой тип (raw type)

Использование generic без значения параметра
Generic класс:
class A {…}
Raw

класс:
A a = new A();

Kolesnikov D.O. SED KNURE

Слайд 9

Wildcard параметризованные типы Использование generic с указанием wildcards: ? extends ?

Wildcard параметризованные типы

Использование generic с указанием wildcards:
? extends <== extends wildcard
? super <==

super wildcard
? <== unbounded wildcard
Generic класс:
class A {…}
Wildcard параметризованный класс:
A a = new A();
A a = new A();
A a = new A();

Kolesnikov D.O. SED KNURE

Слайд 10

Параметры generic с ограничениями При объявлении можно наложить ограничения на значение

Параметры generic с ограничениями

При объявлении можно наложить ограничения на значение параметра

generic.
class A {…}
J1, J2 - интерфейсы
При использовании класса A
если B – интерфейс
T – интерфейс, обязан наследовать B, J1, J2,
если B – класс
T – класс, обязан наследовать B, реализовывать J1, J2

Kolesnikov D.O. SED KNURE

Слайд 11

Ограничения использования параметра generics Внутри generic нельзя: создать объект этого типа

Ограничения использования параметра generics

Внутри generic нельзя:
создать объект этого типа
создать массив такого

типа
использовать в секции catch
использовать в статическом контексте
использовать в instanceof (справа)
наследовать
Замечание: информация о конкретном значении параметра во время выполнения не доступна.

Kolesnikov D.O. SED KNURE

Слайд 12

Преобразования типов raw type ⬄ parameterized types parameterized types ⬄ parameterized types Kolesnikov D.O. SED KNURE

Преобразования типов
raw type ⬄ parameterized types
parameterized types ⬄ parameterized types

Kolesnikov D.O.

SED KNURE
Слайд 13

Преобразования типов Начиная с 7й версии JSE язык включает т.н. daemond

Преобразования типов

Начиная с 7й версии JSE язык включает т.н. daemond оператор:
A

a = new A<>();
Компилятор автоматически подставит подходящее (исходя из контекста) значение параметра generic.

Kolesnikov D.O. SED KNURE