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

У списка есть перегрузки remove(int index) и remove(Object o). Что сделает list.remove(1) для List<Integer>?

MiddleОсновы языка
Коротко

Удалит элемент с индексом 1: перегрузка выбирается на компиляции, и remove(int) подходит без упаковки — на первой фазе подбора. Удалить значение 1 — list.remove(Integer.valueOf(1)).

  • Фазы: без упаковки и varargs → с упаковкой → с varargs
  • Набор Set<Integer> такой ловушки не имеет — remove только по объекту
  • В Java 21 есть removeFirst, removeLast

А ещё Пример того, как автоупаковка и перегрузка взаимодействуют неожиданно

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

Подробно

Перегрузка разрешается статически, по объявленным типам аргументов, и компилятор идёт по фазам: сначала пытается подобрать метод без упаковки и без varargs, затем с упаковкой, и лишь в последнюю очередь с varargs. Литерал 1 имеет тип int, поэтому remove(int) подходит на первой же фазе и побеждает. Чтобы удалить по значению, нужно явно передать объект: remove(Integer.valueOf(1)). Это классический источник багов при переходе с массивов на коллекции. Из той же серии правило: выбор перегрузки не зависит от типа объекта в рантайме, в отличие от переопределения.

Что хотят услышать

  • Результат и правило выбора перегрузки.
  • Как удалить по значению.

Частые ошибки

  • Ожидать, что дженерик-параметр повлияет на выбор перегрузки.
  • Путать статическое разрешение перегрузки с динамической диспетчеризацией переопределения.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Удалит элемент с индексом 1: перегрузка выбирается на компиляции, и точное совпадение по int предпочтительнее упаковки
  • ✗Удалит элемент со значением 1, так как список параметризован Integer
  • ✗Не скомпилируется из-за неоднозначности
  • ✗Выбор зависит от содержимого списка в момент вызова

Что спросят дальше

  • В каком порядке компилятор рассматривает кандидатов на перегрузку?
  • Почему перегрузку с varargs выбирают в последнюю очередь?

Разбор темы

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

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

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

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

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