Что выведет код Middle Основы: типы, обёртки, static обновлено

Что выведет: перегрузка, расширение и упаковка

Вопрос

Что выведет программа (Java 21)? Каждый вывод println с новой строки.

public class Main {
    static void f(long x) { System.out.println("long"); }
    static void f(Integer x) { System.out.println("Integer"); }
    static void f(int... x) { System.out.println("varargs"); }
    static void g(Object x) { System.out.println("Object"); }
    static void g(int... x) { System.out.println("varargs"); }

    public static void main(String[] args) {
        f(5);
        g(5);
        f();
    }
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: long, Object, varargs. Перегрузка выбирается в три фазы: сначала без упаковки и varargs (расширение int в long подходит, поэтому long), потом с упаковкой, и только потом varargs.

Что выведет

long
Object
varargs

Разбор

Перегрузка выбирается в три фазы: сначала без упаковки и varargs (расширение int в long подходит, поэтому long), потом с упаковкой, и только потом varargs. Для g(5) первой фазе ничего не подходит, во второй int упаковывается в Integer, а это Object. Варианты с varargs проигрывают обоим. Вызов f() без аргументов подходит только к varargs.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.