У списка есть перегрузки remove(int index) и remove(Object o). Что сделает list.remove(1) для List<Integer>?
Удалит элемент с индексом 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 выбирают в последнюю очередь?
Разбор темы
- Методы: pass-by-value, перегрузка, varargs
Почему Java всегда pass-by-value, разрешение перегрузки на этапе компиляции и устройство varargs.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.