Sobes.tech
Назад к вопросам
Senior
5

Расскажите про особенности ограничений верхних и нижних границ в wildcards (PECS принцип, ковариантность/контравариантность)

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

В Java wildcard-ограничения позволяют управлять типами в обобщениях (generics) с помощью верхних (extends) и нижних (super) границ, что связано с принципом PECS (Producer Extends, Consumer Super).

  • ? extends T (ковариантность) — используется, когда объект выступает как источник (producer) данных типа T или его подтипов. Позволяет читать данные, но не добавлять (кроме null).
  • ? super T (контравариантность) — используется, когда объект выступает как потребитель (consumer) данных типа T или его супертипов. Позволяет добавлять объекты типа T, но чтение возвращает объекты типа Object или супертипа.

Пример:

List<? extends Number> numbers = new ArrayList<Integer>();
Number num = numbers.get(0); // Можно читать
// numbers.add(10); // Ошибка компиляции

List<? super Integer> integers = new ArrayList<Number>();
integers.add(10); // Можно добавлять
Object obj = integers.get(0); // Чтение возвращает Object

Таким образом, верхняя граница ограничивает типы для чтения (ковариантность), а нижняя — для записи (контравариантность). Это помогает избежать ошибок типов и повысить гибкость кода.