java tutorial - Руководство Java Generics - учебник java - java programming - учиться java - java basics - java for beginners
1- Почему Java Generics?
- Generics это понятие, введенное в Java, начиная с версии 5. Перед тем, как ознакомить вас с понятием Generics, посмотрим на код Java перед версией 5.
- В данном примере, ArrayList это списко, вы можете добавить., удалить, изменить в списке, и иметь доступ к элементам в списке.
BeforeJ5Example.java
Ситуация в Java перед версией 5:
- Вам нужно создать объект ArrayList с целью хранения только элементов вида String, при этом добавить в этот список элемент не вида String где-нибудь в программе (Это вполне возможно), когда вы получаете эти элементы и приводите к виду String, выбрасывается исключение.TODO (Image)
- Java 5 вводит понятие Generics. С помощью Generics, вы можете создать объект ArrayList который позволяет содержать только объекты вида String, и не позволяет иметь другие виды объектов.
J5Example.java
java - джава - учиться java - учебник java -
Пример J5
- примеры java - java-программы
- Когда вы создаете объект ArrayList <String>, он содержить только элементы вида String, компилятор Java не позволяет этому объекту содержать элементы отличающиеся от String.
2- ВидGeneric для Class & Interface
2.1- Generics Class
- ример ниже определяет class generics. KeyValueэто class generics который содержит пару ключей/значения (key/value).
KeyValue.java
- K, V в class KeyValue
называется параметорм generics, который является определенной ссылкой. При использовании этого class-а вам нужно определить точный параметр. - Смотрите пример использования class KeyValue.
KeyValueDemo.java
Запуск примера:
java - джава - учиться java - учебник java -
значение ключа демо
- примеры java - java-программы
2.2- Наследование класса Generics
- Сlass расширенный из class generics, может определить вид параметра generics, сохранить параметры generics или добавить параметры generics.
Пример 1:
PhoneNameEntry.java
Пример использования PhoneNameEntry:
Пример 2:
StringAndValueEntry.java
Пример использования StringAndValueEntry class:
Пример 3:
2.3- Generics Interface
- Интерфейс с параметром Generics:
GenericInterface.java
- Пример class-а, применяющего интерфейс:
GenericInterfaceImpl.java
- Пример class-а, применяющего интерфейс:
GenericInterfaceImpl.java
2.4- Java не поддерживает Generics Throwable
- Вы не можете создать class generic который является наследником Throwable, java не поддерживет создание такого class-а
java - джава - учиться java - учебник java -
универсальный класс исключения
- примеры java - java-программы
- Сообщение ошибки компилятора:
- Java не поддерживает создание class-а Throwable generic, так как это не приносит никакую пользу. Причиной является информация Generic только используется компилятором для управления кодом программиста. В процессе запуска Java информация Generic не существует, объект Mistake
или Mistake являются объектом Mistake.
3- Методы generics
- Метод в class или интерфейсе, который может стать generic (generify).
MyUtils.java
- Например, используя метод generics:
MyUtilsDemo.java
MyUtilsDemo.java
4- Инициализация объекта Generic
- Иногда вы хотите инициировать объект Generic:
Bar.java
MyGeneric.java
MyGenericDemo.java
5- Массив Generic
- Вы можете объявить массив generic, но вы не можете создать массив generic.
Пример:
GenericArray.java
GenericArrayDemo.java
- Возвращаясь к вопросу, почему Java не поддерживает инициализацию массива Generic:
- Это потому что вид generic не существует в момент запуска, List
или List это List. Generic только работает с компиляторами для управления кодом программиста. Это означает, что компилятору Java нужно знать точно, что такое для компиляции (compile) new T[10];. Если не знает точно, то по умолчанию считает T как Object. Тогда:
- Если вы хотите инициализировать массив Generic вам нужно передать Java объект Class
, помогая Java создать массив generic в момент запуска используя Java Reflection. Смотрите изображенный пример:
GArray.java
GArrayDemo.java
6- Generics с Wildcards
- В коде Generic, знак вопроса (?), называется wildcard, который представляет неопределенный вид. Вид параметра wildcard (wildcard parameterized type) это случай вида Generic, там где минимум один параметр является wildcard.
- Пример вида параметра wildcard (wildcard parameterized) :
- Collection
- List extends Number>
- Comparator super String>
- PairString.
- Wildcard могут использованы в разныъ ситуациях: как вид параметра, поле (field), или локальная переменная; иногда как возвратный вид (Будет объяснено в практических примерах). Wildcard никогда не использованы как аргумент для вызова метода Generic, создания объекта class generic, или супертип (supertype).
- Wildcard находящиеся в разных позициях имеют разные значения:
- Collection denotes all instantiations of the Collection interface regardless of the type argument.
- List extends Number denotes all list types where the element type is a subtype of Number.
- Comparator super String denotes all instantiations of the Comparator interface for type argument types that are supertypes of String.
- Wildcard вида параметра не является конкретным видом, который может появиться в операторе new. Он только является подсказкой применяющегося правила, с помощью generics java, что какой вид имеет действие в определенном случае, где wildcard был использован.
- Некоторые недействительные объявления.
6.1- Examples with wildcard
WildCardExample1.java
WildCardExample2.java
6.2- Тип wildcard parameterized не может использовать методы Generics
java - джава - учиться java - учебник java -
шаблон универсального класса
- примеры java - java-программы
ValidWildcard1.java
InvalidWildcard1.java
6.3- Wildcard не может участвовать в new операторе
- Wildcard вида параметра(wildcard parameterized type) не является конкретным видом, и не может появиться в операторе new.