Как Java выбирает перегруженный метод?

Метод называется перегруженным если в одном классе определено несколько методов, которые имеют одно названия, но разный набор параметров. Выбор метода, который нужно запустить в каждом конкретном случае, выполняется на этапе компиляции.

Выбор нужного метода осуществляется за два шага. Последовательность поиска на первом этапе:

  • в первую очередь выбираются методы, подходящие по типу, в том числе учитываются примитивные и ссылочные типы;
  • если на первом этапе выбрать нужный метод не удалось, то учитывается возможность boxing/ unboxing;
  • если и на втором этапе не нашлось требуемого метода, то поиск продолжается с учётом vararg-параметров.

В случае, если требуемый метод не нашёлся, компиляция завершается с ошибкой.

Если при поиске на определённой фазе, находится сразу несколько пригодных методов, выбирается наиболее специфичный. Из двух методов более специфичным считается тот, у которого типы параметров являются подтипами сравниваемого с ним. Таким образом аргументы метода, определённого как более специфичный, подойдут для другого метода, а наоборот нет.

// Сигнатуры foo в порядке убывания приоритета
void foo(long a, Object b) {} // Фаза 1: только upcasting по обоим параметрам
void foo(Integer a, Object b){} // Фаза2: для первого параметра понадобится боксинг
void foo(int a, Object... b) {} // Фаза 3: vararg
void foo(long a, Object... b) {} // Фаза 3:тоже vararg, но метод менее специфичный - long шире чем int
 
void bar(Integer a, int b) {}
void bar(Integer a, Object b) {}
void baz(Object a, Long b) {}
 
void test () {
  foo((int) 42, "Это будет Object");  // Эти параметры удовлетворяют всем трём       фазам - используется первая.
  bar(1, 2); // Оба метода из фазы 2 (нужен боксинг для первого аргумента), int  не подтип Object.
  bar(l, 2); // int -> Integer -> Object работает, int -> long -> Long не работает.
}

Бесплатные Telegram-боты для обучения

Практика с проверкой кода и помощью ИИ-ментора

AndroidSprint AI Mentor

Проверяет Pull Request'ы в GitHub, проводит тестовые собеседования с голосом и таймером, помогает разбираться с кодом 24/7

Попробовать ИИ-ментора →

KotlinSprint Bot

22 урока Kotlin, 220 тестов, 120 практических задач с код-ревью

Начать обучение Kotlin →

AndroidSprint Bot

Тесты по Android SDK, Jetpack Compose, архитектуре приложений

Тесты по Android →

Тебе также может быть интересно

Узнать подробнее
Курс AndroidSprint

Глубокое обучение Android разработке с 0 до получения оффера. Только персональная практика с гарантией получения продуктового опыта.

Курс AndroidSprint - Глубокое <strong>обучение Android разработке с 0 до получения оффера</strong>. Только персональная практика с гарантией получения продуктового опыта.
Узнать подробнее
Узнать подробнее
Практикум по Kotlin

Изучение Котлин с 0 для профессиональной разработки. Личный ментор и разбор кода задач через git-flow.

Практикум по Kotlin - Изучение Котлин <strong>с 0 для профессиональной разработки</strong>. Личный ментор и разбор кода задач через git-flow.
Узнать подробнее
Узнать подробнее
Бесплатные уроки по Kotlin разработке

Самостоятельное освоение базы по языку для дальнейшего развития в Android/back-end разработке или в автотестах.

Бесплатные уроки по Kotlin разработке - <span>Самостоятельное освоение базы по языку для дальнейшего развития в Android/back-end разработке или в автотестах.</span>
Узнать подробнее
Узнать подробнее
Onboarding в разработку

Полное обучение Android разработке с нуля до получения оффера. Делаем упор на практику и обратную связь

Onboarding в разработку - <span>Полное обучение Android разработке с нуля до получения оффера. Делаем упор на практику и обратную связь</span>
Узнать подробнее
Узнать подробнее
Обучающий Kotlin телеграм бот (с тестами)

Ваш основной инструмент для изучения основ языка. Бесплатные тесты и практика внутри.

Обучающий Kotlin телеграм бот (с тестами) - Ваш основной <span>инструмент для изучения основ языка.</span> Бесплатные тесты и практика внутри.
Узнать подробнее
Узнать подробнее
Бесплатные уроки по Android разработке

Самостоятельное обучение разработке Андроид приложений. Понятные видеоуроки с разжеванными примерами.

Бесплатные уроки  по Android разработке - Самостоятельное <span>обучение разработке Андроид приложений.</span> Понятные видеоуроки с разжеванными примерами.
Узнать подробнее
Узнать подробнее
Курс по UI/Unit тестированию

Для ручных тестировщиков, которые готовы осваивать автотесты с использованием актуального стека технологий. [в разработке]

Курс по UI/Unit тестированию - Для ручных тестировщиков, которые <span>готовы осваивать автотесты</span> с использованием актуального стека технологий. [в разработке]
Узнать подробнее
Узнать подробнее
Обучающий Android телеграм бот (с тестами)

Бесплатные теоретические тесты для самопроверки. А также информер на практических спринтах по Android.

Обучающий Android телеграм бот (с тестами) - Бесплатные <span>теоретические тесты для самопроверки.</span> А также информер на практических спринтах по Android.
Узнать подробнее