Получить доступ

Что означает запись List<?> в сигнатуре метода?

JuniorДженерики
Ещё спрашивают так:
  • Чем List<?> отличается от List<Object>?
  • Что такое wildcard в дженериках?
  • Что такое правило PECS?
Коротко

List<?> — список неизвестного типа: читать можно как Object, добавлять нельзя ничего, кроме null.

  • List<String> нельзя передать туда, где ждут List<Object>, а туда, где List<?>, — можно
  • ? extends T — читать как T (производитель), ? super T — писать T (потребитель): PECS

А ещё Подходит для методов, которым достаточно читать или узнать размер

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Дженерики в 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?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем