Что проверяет вопрос про bounded wildcards в методах-утилитах

Собеседующий не спрашивает синтаксис extends T ради синтаксиса. Он проверяет, понимаете ли вы, почему метод, принимающий List extends Number, нельзя использовать для добавления элементов, а только для чтения.

Это прямое следствие того, что компилятор не знает конкретный тип внутри wildcard. Список может быть List, а может List — добавить туда безопасно нечего, кроме null.

public static double sumAll( List extends Number numbers ) { double sum = 0; for (Number number : numbers) { sum += number.doubleValue(); } return sum; }

Обратный случай — ? super T — используют, когда пишете в структуру, а не читаете. Компаратор для сортировки объектов конкретного типа принимает Comparator super T, чтобы можно было передать компаратор для суперкласса.

Дальше спросят: почему нельзя написать один универсальный метод без wildcard, просто через List. Ответ — из-за инвариантности generics в Java: List не является подтипом List, даже если Integer является подтипом Number. Без wildcard такой метод просто не примет список интов.

Wildcard — это не синтаксический сахар, а способ сказать компилятору, что вы обещаете делать со списком: только читать или только писать.

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

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


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