Подтвердить что ты не робот

Почему метод Short вызывает метод integer?

public class Yikes {
    public static void go(Long n) {
        System.out.print("Long ");
    }

    public static void go(Short n) {
        System.out.print("Short ");
    }

    public static void go(int n) {
        System.out.print("int ");
    }

    public static void main(String[] args) {
        short y = 6;
        long z = 7;
        go(y);
        go(z);
    }
}

Эта программа предоставляет выходные данные

int Long

Я думал, что выход был

short Long

В чем причина этого?

4b9b3361

Ответ 1

раздел разрешения перегрузки в JLS объясняет, почему:

  • Первая фаза (§15.12.2.2) выполняет разрешение перегрузки без разрешения преобразования бокса или unboxing или использования метода переменной arity призывание. Если на этом этапе не обнаружен какой-либо применимый метод, обработка продолжается до второй фазы.

Это гарантирует, что любые вызовы, которые были действительны на языке программирования Java до Java SE 5.0, не считаются двусмысленными в результате внедрения методов переменной arity, неявного бокса и/или распаковки. Однако объявление метода переменной arity (§8.4.1) может изменить метод, выбранный для выражения вызова метода данного метода, поскольку метод переменной arity рассматривается как метод фиксированной arity в первой фазе. Например, объявление m(Object...) в классе, который уже объявляет m(Object), вызывает m(Object) больше не выбирается для некоторых выражений вызова (например, m(null)), а m(Object[]) более конкретно.

  1. Вторая фаза (§15.12.2.3) выполняет разрешение перегрузки при разрешении бокса и распаковки, но все же исключает использование вызова метода переменной arity. Если на этом этапе не обнаружен какой-либо применимый метод, обработка продолжается до третьей фазы.

В первой фазе компилятор не включает метод go(Short n) в своем разрешении. Вместо этого он считает go(int n) применимым методом. Этот метод применим, поскольку расширение short преобразуется в int.

Ответ 2

Компилятор предпочитает преобразовывать a short в int, а не помещать его в объект short.

Ответ 3

Попробуйте следующее:

Вместо

public static void go(Short n) {
    System.out.print("Short ");
}

попробовать

public static void go(Short n) {
    System.out.print("Short ");
}