Что проверяет вопрос «объясните PECS для generics wildcards»

PECS — Producer Extends, Consumer Super. Мнемоника Джошуа Блоха для того, чтобы решить, какой wildcard ставить в generic-параметр: ? extends T или ? super T.

Если структура данных только отдаёт значения — она producer, ставим extends. Если только принимает — она consumer, ставим super. Вопрос звучит просто, но проверяет понимание ковариантности и инвариантности generic-типов в Java, а не саму мнемонику.

public static void copy( List extends Number source, List super Number dest) { for (Number n : source) { dest.add(n); } }

В source можно только читать — компилятор не знает точный тип элемента, только что это Number или подтип. Добавить туда что-либо кроме null нельзя: компилятор не может гарантировать, что добавляемый тип совпадёт с реальным.

Спросят следом: почему нельзя написать List<Number> и передать туда List<Integer> без wildcard. Ответ — Java generics инвариантны: List<Integer> не является подтипом List<Number>, даже если Integer — подтип Number. Wildcard — единственный способ дать компилятору узнать про совместимость направленно, а не полностью.

PECS — это не правило синтаксиса, это ответ на вопрос «что эта коллекция делает с данными» до того, как выбирать extends или super.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки