Одной из сложностей, с которой сталкиваются новички при изучении Java, является понимание принципа PECS (Producer Extends, Consumer Super). Эта концепция используется в контексте обобщений (generics) и помогает разрешить путаницу между ключевыми словами extends
и super
.
Вот простой пример. Предположим, есть список чисел, и есть метод, который принимает список элементов и добавляет в него новые элементы. Вопрос состоит в том, какой тип указать для списка в параметре метода?
public void addElements(List<?> list) { list.add(1); // ошибка компиляции }
Здесь возникает ошибка компиляции, потому что с точки зрения компилятора тип списка неизвестен.
Принцип Producer Extends
Принцип PECS предлагает решение для таких ситуаций. Согласно принципу «Producer Extends», если класс или метод должны читать данные из некоторой коллекции, следует использовать ключевое слово extends
.
public void addElements(List<? extends Number> list) { Number number = list.get(0); // это работает list.add(1); // ошибка компиляции }
Теперь метод может безопасно читать данные из списка, так как он знает, что все элементы являются числами. Однако он не может добавлять элементы в список, потому что он не знает точный тип элементов списка.
Принцип Consumer Super
С другой стороны, если класс или метод должны записывать данные в коллекцию, следует использовать ключевое слово super
.
public void addElements(List<? super Integer> list) { Number number = list.get(0); // ошибка компиляции list.add(1); // это работает }
Теперь метод может безопасно добавлять целые числа в список, но он не может читать данные из списка, потому что он не знает точный тип элементов списка.
В заключении, принцип PECS является важным инструментом для работы с обобщениями в Java. Он помогает разрешить путаницу между ключевыми словами extends
и super
и делает код более безопасным и предсказуемым.
Добавить комментарий