При перегрузке методов, содержащих параметры, которые не совпадают, 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, поскольку он является наименьшим размером больше байта?