При перегрузке методов, содержащих параметры, которые не совпадают, JVM всегда будет использовать метод с наименьшим аргументом, который шире, чем параметр.
Я подтвердил вышеизложенное на следующих двух примерах:
Расширение: байт расширен до int
class ScjpTest{
static void go(int x){System.out.println("In Int");}
static void go(long x){System.out.println("In long");}
public static void main (String[] args){
byte b = 5;
go(b);
}
}
Бокс: int упакован вЦелое число
class ScjpTest{
static void go(Integer x){System.out.println("In Int");}
static void go(Long x){System.out.println("In Long");}
public static void main (String[] args){
int b = 5;
go(b);
}
}
В обоих приведенных выше примерах выводится "In Int", что является правильным.Я смущен, хотя, когда ситуация включает в себя var-args, как показано в следующем примере
class ScjpTest{
static void go(int... x){System.out.println("In Int");}
static void go(long... x){System.out.println("In lInt");}
public static void main (String[] args){
byte b = 5; //or even with: int b = 5
go(b);
}
}
Вышеприведенное приводит к следующей ошибке:
ScjpTest.java:14: reference to go is ambiguous, both method go(int...) in ScjpTest and method go(long...) in ScjpTest match
go(b);
^
1 error
Почему не применяется то же правилокак в предыдущих примерах?то есть расширить байт до типа int, так как он наименьший, который больше байта?