Обнаружение дефекта в функции объединения двух списков

Направление addAll перепутано: добавлять нужно в first, который потребляет T, из second, который производит T. Исходный вызов обычно не компилируется из-за wildcard capture.

Короткий ответ

Что ответить на собеседовании

Направление addAll перепутано: добавлять нужно в first, который потребляет T, из second, который производит T. Исходный вызов обычно не компилируется из-за wildcard capture.

Подробный разбор

Ответ с пояснениями

Условие

Предоставлен метод addAll, принимающий два списка: first и second. Требуется выявить возможную ошибку в его реализации.

public <T> void addAll(List<? super T> first, List<? extends T> second){
    second.addAll(first);
}

Ответ

Направление addAll перепутано: добавлять нужно в first, который потребляет T, из second, который производит T. Исходный вызов обычно не компилируется из-за wildcard capture.

public <T> void addAll(List<? super T> first, List<? extends T> second) {
    first.addAll(second);
}

Это применение PECS: producer extends, consumer super. First может быть List<T> или список супертипа; second — список T или его подтипа. Целевая коллекция должна поддерживать изменение, иначе возможен UnsupportedOperationException. Копируются ссылки на элементы, не сами объекты. Самодобавление и общие backing-структуры требуют отдельного контракта.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее