Что проверяет вопрос «объясните 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 — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки