← Назад к вопросам

Как используется принцип PECS

2.3 Middle🔥 141 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Принцип PECS (Producer Extends Consumer Super)

PECS — это мнемоническое правило для использования wildcard-типов в generics. Оно помогает определить, когда использовать extends и super при работе с параметрами-обобщениями.

Основное правило

Producer Extends — когда вы только читаете данные из коллекции:

public void addAll(List<? extends Number> source) {
    for (Number num : source) {
        // Читаем данные
        System.out.println(num);
    }
}

Здесь ? extends Number означает, что список может содержать Number или его подклассы. Мы можем читать элементы, но не можем добавлять (кроме null).

Consumer Super — когда вы только пишете данные в коллекцию:

public void fillWithNumbers(List<? super Number> target) {
    target.add(1);
    target.add(2.5);
    target.add(Long.MAX_VALUE);
}

Здесь ? super Number означает, что список может содержать Number или его суперклассы. Мы можем добавлять Number и его подклассы, но при чтении получим Object.

Практический пример

public class Collections {
    // Producer — читаем из source
    public static <T> void copy(List<? super T> dest, List<? extends T> source) {
        for (T item : source) {
            dest.add(item);
        }
    }
}

Вызовы:

List<Integer> integers = Arrays.asList(1, 2, 3);
List<Object> objects = new ArrayList<>();

Collections.copy(objects, integers);  // OK

Когда использовать

  • ? extends T в методах с параметрами, из которых только читаете
  • ? super T в методах с параметрами, в которые только пишете
  • Без wildcard когда нужны и чтение, и запись

Это правило обеспечивает гибкость и безопасность типов при работе с hierarchies классов и generic-коллекциями.

Как используется принцип PECS | PrepBro