2012-09-28 75 views
0

假設此代碼:尷尬VAR-args參數

public class Test{ 

    public static void main(String[] args) { 
     Test.testInt(new int[]{2,3}); 
     Test.testInteger(new Integer[]{2,3}); 
    } 

    public static void testInt(Object... elements){ 
     System.out.println(elements[0] instanceof int[]); 
    } 

    public static void testInteger(Object... elements){ 
     System.out.println(elements[0] instanceof Integer); 
    } 

} 

在兩種情況下,一個期望具有含有2和3 一個一維陣列所以預期輸出應爲第一眼:

false 
true 

驚喜!真正的輸出是:

true 
true 

更新這個帖子:

其實,這不是一個很好的問題,因爲我還沒有意識到,這起案件是按照VAR-ARGS規則。總而言之,即使Var-args是參數,int []數組也不能自動寫入到Integer []中;沒有特殊的待遇。

回答

6

你不能將一個基本數組自動裝箱到一個「包裝」數組中:一個數組是一個完全不同的類型!自動裝箱原語有一些非常明顯的用例。這些用例對於數組不存在。

您的方法簽名要求至少一個Object,並且您提供了一個:int[]。你的方法簽名還允許你提供一個數組,你可以使用Integer[]

還值得指出的是,所有可變參數方法都可以用參數類型的數組調用,這就是您在Integer中所做的。由於int不是Object,因此編譯器會將數組視爲Object

+0

謝謝,我知道,我不是很清楚,我已經更新了這篇文章。 – Mik378

+0

我完全同意你的觀點,但這並沒有回答我的問題:)我的問題是:爲什麼Java在傳遞給var-args參數時讓原始數組創建了二維數組? – Mik378

+0

已更新。見第三段。 –