Вопрос с собеседования · Java

У списка есть перегрузки 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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования