2011-12-03 96 views
3

我知道java中的數組擴展了對象,所以爲什麼將它們作爲參數傳遞不起作用。爲什麼原始類型的數組不被視爲對象

public static void main(String[] args) { 
    foo(new Integer[]{1, 2, 3}); // 1 
    foo(new int[]{1,2,3}); //2 
} 

static void foo(Object... params) { 
    System.out.println(params[0]); 
} 

此外,爲什麼不能治療陣列作爲單個參數(線1)從上面的運行

輸出是:

1 
[[email protected] 
+1

我不明白你的問題是什麼。你的意思是「不起作用」? –

+0

它不打印1(第2行) –

回答

5

在java中與每一個功能(X ...)簽名需要一個X數組作爲參數。

在你的第一個例子中,你會發出警告,你沒有強制轉換,而是將整數數組作爲可變參數對象傳遞。 Java足夠聰明,你可能想將它作爲Object []而不是單個Object傳遞給它。如果向Object []添加強制轉換,則警告消失。

在第二個例子中,數組只是第一個可變參數,因爲每個數組都是一個對象。它不能作爲一個對象數組傳遞,因爲它是一個基元數組。任何類型的

陣列是作爲可以驗證運行此代碼片段

public class Test{ 
    public static void test(Object a) { 
     System.out.println("ok"); 
    } 

    public static void main(String args[]){ 
     int[] i = {1,2,3,4}; 
     test(i); 
    } 
} 

它輸出「OK」,這意味着,INT []是一個對象的對象。 〜

+0

的值,但自動裝箱怎麼樣,爲什麼它沒有把它們裝入物體? –

+0

@sleimanjneidi - 因爲這不是自動裝箱的方式。 Autoboxing會將int轉換爲Integer,但不會將int []轉換爲Integer []。爲什麼?因爲它會導致比解決問題更多的問題! –

0

Object ...將數組解釋爲參數列表,而不是單個對象。 爲什麼不使用Set作爲容器?

3

我只是想你的代碼,我也得到:

1 
[[email protected] 

的事情是,你的方法需要通過可變參數Object陣列。所以,對於第一個電話,params是包含每個人Integer 3個元素的數組。但是,int s不是Object s(int的包裝類,Integer,但是int不是),因此對於第二個調用,params是包含實際數組對象的單個元素的數組。上面的亂碼是數組的toString()方法的輸出。

如果您將用Object[]替換可變參數呼叫,則第二個呼叫將不會編譯,因爲int[]不是Object[]

相關問題