Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: generics, extends

В чём разница между extends и super в generics?

Вопрос проверяет понимание ковариантности и контравариантности, а также умение корректно использовать generics при чтении и записи данных.

Короткий ответ

extends используется, когда нужно читать данные из обобщённого типа.
super используется, когда нужно записывать данные в обобщённый тип.
extends ограничивает тип сверху, super — снизу.
Оба механизма помогают писать безопасный и универсальный код.
Главное правило — PECS: Producer Extends, Consumer Super.

Длинный ответ

Определение

  • ? extends T — wildcard с верхней границей

  • ? super T — wildcard с нижней границей

Они определяют, какие типы допустимы и какие операции разрешены.

extends — для чтения

Используется, когда структура производит данные.

List<? extends Number> numbers = List.of(1, 2.5, 3L);
Number n = numbers.get(0);

Особенности:

  • можно читать элементы как Number

  • нельзя добавлять элементы (кроме null)

Причина:

  • фактический тип может быть List<Integer>, List<Double> и т.д.

super — для записи

Используется, когда структура принимает данные.

List<? super Integer> numbers = new ArrayList<Number>();
numbers.add(10);
numbers.add(20);

Особенности:

  • можно добавлять Integer и его наследников

  • при чтении доступен только тип Object

Правило PECS

Чтобы проще запомнить:

  • Producer Extends — если читаем

  • Consumer Super — если пишем

Вывод

extends и super решают разные задачи и не взаимозаменяемы. Правильный выбор делает код безопасным, расширяемым и понятным.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • Java

    Java

Ключевые слова

#generics

#extends

Подпишись на Java Developer в телеграм