Podczas przeciążania metod, które zawierają parametry, które nie pasują, JVM będzie zawsze używać metody z najmniejszym argumentem, który jest szerszy niż parametr.Metody przeciążania za pomocą var-args - w połączeniu z boksem i poszerzaniem
I potwierdziły wyżej z dwoma następującymi przykładami:
Rozszerzenie: Bajt rozszerzony 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);
}
}
Boks: int zapakowane Integer
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);
}
}
Oba powyższe przykłady wyświetlają "In Int", co jest poprawne. Jestem zdezorientowany, choć gdy sytuacja wiąże VAR args, jak pokazano w poniższym przykładzie
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);
}
}
Powyższy produkuje następujący błąd:
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
Dlaczego nie ona stosować te same reguły jak w poprzednim przykłady? tj. poszerzyć bajt do int, ponieważ jest najmniejszy, który jest większy niż bajt?
On Java 7, twój ostatni przykład działa dobrze. – toto2