Почему основной метод не вызывает первый метод?
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
?
Выбирая наиболее подходящий метод, компилятор сначала предпочитает делать Расширение, затем Бокс, а в конце, если все не удается, Вар-Аргс. В вашем случае он расширит все bytes
до ints
чтобы получить метод сопоставления, с 3 параметрами типа int
. Подробнее об этом см. В статье JLS §15.12.2.
при вызове компилятора метода сначала проверьте имя метода, списки параметров с типом данных, чтобы точно соответствовать, например, перегрузка метода.
если компилятор не получает точного соответствия методу, он ищет наилучшее совпадение. в вашем случае сначала проверьте метод 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, целочисленным типом данных.
В printValue
случае вы перегрузили метод printValue
. Теперь при выполнении вызова printValue(b,b,b);
компилятор не может найти подпись printValue
которая принимает byte
качестве типа аргумента и имеет 3 аргумента, но может обнаруживать, что printValue
имеет перегрузку, которая принимает 3 параметра, но принимает тип int
а byte
может быть неявно ливан в int
.
поэтому он заканчивает вызов метода overload printValue(int i, int j, int k)