一致しないパラメーターを含むメソッドをオーバーロードする場合、JVMは常に、パラメーターよりも幅が広い最小の引数を持つメソッドを使用します。
私は次の2つの例で上記を確認しました:
拡大:バイトが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);
}
}
上記の両方の例は、正しい「InInt」を出力します。次の例に示すように、状況に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に広げますか?