Hardwildcardsgenerics

Что такое wildcards (?, ? extends T, ? super T)?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Generics invariant: List<Number> = new ArrayList<Integer>(); — ошибка, хотя Integer — Number. Wildcards решают проблему.

// ? extends T — ковариантность: можно читать T, нельзя писать
void printAll(List<? extends Number> list) {
    for (Number n : list) { System.out.println(n); } // OK
    // list.add(1); // ошибка — неизвестно какого подтипа
}

// ? super T — контравариантность: можно писать T, читать как Object
void addNumbers(List<? super Integer> list) {
    list.add(1); list.add(2);   // OK
    Number n = list.get(0);     // ошибка — только Object
}

Правило PECS: Producer Extends, Consumer Super. Если из коллекции читаем — ? extends T; если пишем — ? super T. Пример: void copy(List<? extends T> src, List<? super T> dst).

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.