Что означает запись List<?> в сигнатуре метода?
- Чем List<?> отличается от List<Object>?
- Что такое wildcard в дженериках?
- Что такое правило PECS?
List<?> — список неизвестного типа: читать можно как Object, добавлять нельзя ничего, кроме null.
List<String>нельзя передать туда, где ждутList<Object>, а туда, гдеList<?>, — можно? extends T— читать как T (производитель),? super T— писать T (потребитель): PECS
А ещё Подходит для методов, которым достаточно читать или узнать размер
Подробно
Дженерики в Java инвариантны: List<String> не является подтипом List<Object>. Иначе можно было бы через List<Object> положить число в список строк.
List<?> означает «список чего-то одного, но неизвестно чего». Отсюда правила:
- читать можно — элемент гарантированно
Object; - добавлять нельзя — за ссылкой может стоять список строк, и положить туда что-либо (кроме
null) было бы ошибкой; - передать можно любой
List<...>.
Ограниченные wildcards уточняют:
List<? extends Number>— список чисел какого-то подтипа: читать какNumberможно, добавлять нельзя;List<? super Integer>— список, куда можно положитьInteger: писать можно, читать — только какObject.
Правило PECS — Producer Extends, Consumer Super: если коллекция отдаёт значения методу — extends, если принимает — super. Пример из JDK: Collections.copy(List<? super T> dest, List<? extends T> src).
Пример
static void printAll(List<?> list) {
for (Object o : list) System.out.println(o);
// list.add("x"); // ошибка компиляции
}
static double sum(List<? extends Number> nums) {
return nums.stream().mapToDouble(Number::doubleValue).sum();
}
printAll(List.of("a", "b"));
sum(List.of(1, 2.5));Что хотят услышать
- Значение: неизвестный тип элементов, чтение как Object, запрет добавления.
- Отличие от List<Object> и инвариантность дженериков.
- extends и super, правило PECS — плюс.
Частые ошибки
- Отождествлять эту запись со списком объектов.
- Пытаться добавить элемент в такой список.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Список, который может содержать элементы разных типов одновременно
- ✓Список неизвестного типа: читать как Object, писать только null
- ✗То же самое, что List<Object>
- ✗Список, для которого отключены проверки типов
Что спросят дальше
- Чем отличаются формы с extends и с super?
- Что утверждает правило PECS?
Разбор темы
- Wildcards и правило PECS
Инвариантность дженериков против ковариантных массивов, ? extends/super, и когда что выбирать по PECS.
Связанные вопросы
- Метод должен перекладывать элементы из источника в приёмник. Какая сигнатура правильна по правилу PECS? Middle
- Что можно делать со списком, объявленным как List<? extends Number>? Middle
- Почему List<String> нельзя присвоить переменной типа List<Object>? Middle
- Что такое generics в Java и зачем нужен wildcard ? extends / ? super? Junior
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.