Направление 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-структуры требуют отдельного контракта.