generics
Generics
Предназначение
Преимущества
Терминология
Параметризация
Байт код параметризованных generic-ов
Сырой тип (raw type)
Wildcard параметризованные типы
Параметры generic с ограничениями
Ограничения использования параметра generics
Преобразования типов
Преобразования типов
Массивы параметризованных generic
78.89K
Category: programmingprogramming

Generics (Java)

1. generics

GENERICS

2. Generics

Обобщенные:
типы (generic types)
классы (без enum, исключений, анонимных!)
интерфейсы (без аннотаций!)
методы (generic methods)
конструкторы (generic constructors)
Пример generics – Collection framework из
состава Java core.
Kolesnikov D.O. SED KNURE
2

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

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

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

Определение ошибок использования
типов на этапе компиляции.
Использование параметризованных
типов
методов
конструкторов
Использование wildcards
с ограничениями
без ограничений
Kolesnikov D.O. SED KNURE
4

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

Generic:
class A<T> {…}
класс
public <T> A() {…} конструктор
public <T> T m(T t) {…} метод
T – параметр generic-а
Kolesnikov D.O. SED KNURE
5

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

Подстановка вместо параметра
конкретного значения при
использовании generic:
Параметризованный класс:
A<String> a = new A<String>();
Kolesnikov D.O. SED KNURE
6

7. Байт код параметризованных generic-ов

Один байт код на все варианты
конкретных значений параметра.
Kolesnikov D.O. SED KNURE
7

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

Использование generic без значения
параметра
Generic класс:
class A<T> {…}
Raw класс:
A a = new A();
Kolesnikov D.O. SED KNURE
8

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

Использование generic с указанием wildcards:
? extends <== extends wildcard
? super <== super wildcard
? <== unbounded wildcard
Generic класс:
class A<T> {…}
Wildcard параметризованный класс:
A<?> a = new A<String>();
A<? extends Number> a = new A<Integer>();
A<? super Integer> a = new A<Number>();
Kolesnikov D.O. SED KNURE
9

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

При объявлении можно наложить ограничения на
значение параметра generic.
class A <T extends B & J1 & J2> {…}
J1, J2 - интерфейсы
При использовании класса A
если B – интерфейс
T – интерфейс, обязан наследовать B, J1, J2,
если B – класс
T – класс, обязан наследовать B, реализовывать J1, J2
Kolesnikov D.O. SED KNURE
10

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

Внутри generic нельзя:
1)
создать объект этого типа
2)
создать массив такого типа
3)
использовать в секции catch
4)
использовать в статическом контексте
5)
использовать в instanceof (справа)
6)
наследовать
Замечание: информация о конкретном значении параметра во
время выполнения не доступна.
Kolesnikov D.O. SED KNURE
11

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

raw type parameterized types
parameterized types parameterized types
Kolesnikov D.O. SED KNURE
12

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

Начиная с 7й версии JSE язык включает
т.н. daemond оператор:
A<String> a = new A<>();
Компилятор автоматически подставит
подходящее (исходя из контекста)
значение параметра generic.
Kolesnikov D.O. SED KNURE
13

14. Массивы параметризованных generic

Объявить переменную типа массив параметризованных
типов можно:
List<String>[] ar;
Создать массив нельзя:
ar = new ArrayList<String>[]; // compile time error!
Исключение (допустимо только для параметризованного
wildcard без ограничений):
List<?>[] x = new ArrayList<?>[3]; // all ok
Kolesnikov D.O. SED KNURE
14
English     Русский Rules