2011-12-29 70 views
1

爲什麼編譯失敗會失敗?將包裝類拆箱到var-arg

class ZiggyTest { 

    public static void main(String[] args){ 

     Integer[] i = {1,2,3,4}; 
     test(i); 

    } 

    public static void test(int... s){ 
     for (int x : s){ 
      System.out.println(x); 
     } 
    } 
} 

ZiggyTest.java:26: test(int...) in ZiggyTest cannot be applied to (java.lang.Integer[]) 
     test(i); 
     ^
1 error 

什麼是規則,當涉及到拆箱包裝陣列VAR-ARGS。

如果我陣列聲明爲

int[] j = {1,2,3,4}; 
test(j); 

回答

2

這是因爲自動裝箱可以從原始只會發生在它的包裝(如intInteger),而不是從一個原始的陣列到相應包裝的數組。與autounboxing類似的情況。

例如如果你定義的測試方法如下:

public static void test(int n) {} //<-- param n is of type int primitive 

如下,你可以這樣做:

Integer n = 1; // autoboxing happens here too 
test(n); //this is a valid call because n is autounboxed 

但是,如果你定義的測試方法如下:

public static void test(int[] n) {} //<-- param n is an array of int primitives 

然後什麼如下將失敗:

Integer[] ns = {1, 2}; // no autboxing here because we are dealing with array (just a syntactic sugar) 
// Integer[] ns = new int[]{1, 2}; // something like this is not valid 
test(ns); // this will fail       
3

int S上的陣列,它工作不是Integer秒的陣列。編譯器試圖在引擎蓋下做到這一點。所以你不能做你想做的事。

您可以堅持使用一種數組,或使用commons-lang中的ArrayUtils.toPrimitive(..)

1
int[].class != Integer[].class. 
int[].class = class [I 
Integer[].class = class [Ljava.lang.Integer; 

這就是爲什麼它抱怨。

+0

w帽子是班[我? – ziggy 2011-12-29 15:53:12

+0

這是int數組的類類型。我 - 代表int,[ - 代表一維數組 – 2011-12-29 15:58:57

1

您傳遞方法的內容與預期的內容不符。你將我設置爲Integer對象的數組。然後你將它傳遞給方法test()。你已經定義的唯一方法test是一個基本類型的int(Integer!= int)。您可以快速解決它通過改變測試的函數定義爲:

public static void test(Integer[] s){