Java Generics — всё, что нужно знать — 30 июня 2026 г. в 17:32:49.940
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>, если нужна вставка (например, для пакетной обработки или модификации коллекции).

