TGViewer
Java Portal | Программирование Java Portal | Программирование @java_iibrary · 11.6K subscribers
Post #2300 2.1K
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>, если нужна вставка (например, для пакетной обработки или модификации коллекции).

👉 Java Portal
  • ❤ 8
  • 🔥 5
  • 👍 3
More from @java_iibrary
  1. Sep 24, 2026Java-разработчики, в чём разница между volatile и synchronized? Многие используют их. Но в…
  2. Sep 23, 2026Готовимся к System Design интервью уровня Middle и Senior Полезный конспект по проектирова…
  3. Sep 23, 2026Java-разработчики, знаете разницу между Shallow Copy и Deep Copy? Вы копируете объект, но…
  4. Sep 22, 2026Java-разработчики: Почему ArrayList увеличивает свою ёмкость примерно на 50%, когда заканч…
  5. Sep 22, 2026Прогрев от Java-бабули 🙂 👉 Java Portal
  6. Sep 21, 2026Шпаргалка по проектированию веб систем System Design 101 Подробное руководство по архитект…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →