Почему вывод int?

1

Почему основной метод не вызывает первый метод?

public class Test {           

    public static void printValue(byte...b) {  
        System.out.println("long");  
    }  

    public static void printValue(int i, int j, int k) {  
         System.out.println("int");  
    }

    public static void main(String... args) {  
        byte b = 9;  
        printValue(b,b,b);  
    }  
}  

Почему выходной int?

Теги:
variadic-functions
method-overloading
overloading

3 ответа

5
Лучший ответ

Выбирая наиболее подходящий метод, компилятор сначала предпочитает делать Расширение, затем Бокс, а в конце, если все не удается, Вар-Аргс. В вашем случае он расширит все bytes до ints чтобы получить метод сопоставления, с 3 параметрами типа int. Подробнее об этом см. В статье JLS §15.12.2.

  • 0
    Почему компилятор предпочитает делать это перед выбором правильного метода?
  • 0
    Можете ли вы объяснить о расширении и боксе в этом случае?
Показать ещё 8 комментариев
1

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

если компилятор не получает точного соответствия методу, он ищет наилучшее совпадение. в вашем случае сначала проверьте метод printValue(), имеющий три параметра.

он выбирает общедоступный метод static void printValue (int i, int j, int k), потому что -

-compiler не получает точный метод matced.

-it ищет подходящее соответствие, например byte-> int, char → int, int-> long может быть сделано явно. (расширение) или автобоксинг. ** меньший тип данных может быть преобразован в большее значение типа данных. поэтому он вызывает printValue (int i, int j, int k). ** -your переданное значение может быть легко преобразовано в целое. 9- также является байтом, char, целочисленным типом данных.

1

В printValue случае вы перегрузили метод printValue. Теперь при выполнении вызова printValue(b,b,b); компилятор не может найти подпись printValue которая принимает byte качестве типа аргумента и имеет 3 аргумента, но может обнаруживать, что printValue имеет перегрузку, которая принимает 3 параметра, но принимает тип int а byte может быть неявно ливан в int.

поэтому он заканчивает вызов метода overload printValue(int i, int j, int k)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню