2011-08-14 56 views
5

當重載包含不匹配參數的方法時,JVM將始終使用具有比參數更寬的最小參數的方法。使用var-args重載方法 - 結合裝箱和加寬

我已經證實了上述具有以下兩個例子:

加寬:字節加寬到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); 

    } 

}

拳擊:整數盒裝到整型

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,因爲它是大於字節的最小字節?

+0

在Java 7,你最後的例子工作正常。 – toto2

回答

5

VAR-ARGS語法僅僅是一個別名傳遞數組作爲參數:

foo(int ... arg)等於foo(int[] arg)

但是陣列是不分層。 String[]不是Object[]的子類。完全相同的規則與方法參數相關。因此,編譯器無法區分2個過載方法,當您通過byte時接受long[]int[]

+0

錯誤。 String []是Object []的子類。數組在Java中是協變的(但不是泛型)。看到我的答案:它實際上是舊版Java版本中的一個錯誤,它不起作用。 ziggy的例子在Java 7中起作用。 – toto2

+0

...但實際上這個例子中所起的作用甚至不是數組繼承,而是擴大了原始類型的轉換。 – toto2

1

它實際上在Java 7中工作:它也返回「In Int」中的varargs示例。我想這只是以前版本中的一個缺失功能​​。我不知道你使用的是什麼Java版本,但它可能也適用於Java 6.

但是我必須說我甚至感到驚訝,即使你的第一個例子工作(沒有可變參數)。我並不知道原始拓展轉化。 順便說一句,如果你使用Byte,Integer和Long,你的第一個和最後一個例子會失敗,因爲這些類型之間沒有層次結構(除了它們都是Number的子類)。

1

正如AlexR指出的那樣,var-args就像一個數組。基元的陣列(如byte[] short[] int[] long[] float[] double[]似乎內部編譯同一類這就是爲什麼你的重載方法是不明確的。但是下面的代碼是完全有效的:。
static void go(int... x){System.out.println("In Int");}
static void go(Long... x){System.out.println("In lInt");}

這編譯成功(因爲int[]Long[]是不同的類型) ,併產生輸出In Int
如果你正在準備SCJP,我會強烈建議你閱讀本書SCJP Sun Certified Programmer for Java 6 Exam 310-065。本節本書重載涵蓋了所有的招數用混合拳擊和無功ARGS。