tgoop.com/Java_Iibrary/1452
Last Update:
Java Generics — всё, что нужно знать
1. Box<T>
→ Обобщённый класс
• Используй, когда класс работает с любым типом (например, обёртка вокруг любого объекта, как Box<User>, Box<Integer>).
2. <T> void print(T val)
→ Обобщённый метод
• Используй, когда метод должен принимать любой тип (например, для печати любого объекта, логирования, сравнения и т.п.).
3. <T extends Number>
→ Ограниченный тип
• Называется верхней границей.
• Используй, когда тип должен быть подклассом чего-то (например, утилита для работы с int, double, float).
4. <T extends A & B>
→ Несколько ограничений
• Заставляет T реализовывать и A, и B.
• Используй, когда нужны обе особенности (например, сортировка объекта, который также требует валидации).
5. <?>
→ Неограниченный подстановочный тип
• Это означает неизвестный тип.
• Используй, когда не важен тип, нужно только читать (например, печать элементов из любого списка).
6. <? extends T>
→ Верхняя граница подстановочного типа
• Означает некоторый подкласс T.
• Используй при чтении из коллекции (например, чтение чисел из List<? extends Number> без модификации).
7. <? super T>
→ Нижняя граница подстановочного типа
• Означает некоторый суперкласс T.
• Используй при записи в коллекцию (например, добавление Integer в List<? super Integer>
).
8. Правило PECS
• Producer Extends, Consumer Super.
• Используй extends
для чтения, super
для записи (например, API-вход против обработки ответа).
9. List list = new ArrayList();
→ Сырой тип
• Это сырой тип.
• Избегай — тк теряется типовая безопасность (например, компилятор не поймает, если добавишь неверные типы).
10. Стирание типов
• Java удаляет всю информацию об обобщениях во время выполнения.
• Поэтому нельзя использовать T.class, new T()
, или instanceof T
(например, нельзя делать проверки или создавать объекты на основе T).
11. Обобщённый конструктор
<T> MyClass(T val) { }
• Используй, когда конструктору нужен обобщённый параметр, даже если сам класс не обобщённый (например, инициализация с динамическими типами).
12. Обобщённый интерфейс
interface Mapper<F, T> { T map(F input); }
• Используй при преобразовании одного типа в другой (например, DTO → сущность).
13. Нельзя использовать примитивы
• Нельзя
List<int>
— только List<Integer>
.• Используй обёртки (коллекции могут хранить только объекты, не примитивы).
14. Нельзя создавать массивы с обобщением
•
new T[]
не работает.• Используй
List<T>
вместо (например, динамические коллекции).15. Нельзя использовать подстановочные типы для вставки
• Нельзя вставлять в
List<? extends Number>
.• Используй
<? super Number>
, если нужна вставка (например, для пакетной обработки или модификации коллекции).