Распаковка классов-обёрток в var-arg - PullRequest
1 голос
/ 29 декабря 2011

Почему это не удается при сбое компиляции?

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);

Ответы [ 4 ]

3 голосов
/ 29 декабря 2011

Массив int с не является массивом Integer с. И компилятор пытается сделать это под капотом. Таким образом, вы не можете делать то, что вы хотите.

Вы можете придерживаться одного типа массивов или использовать ArrayUtils.toPrimitive(..) от commons-lang.

2 голосов
/ 29 декабря 2011

Это потому, что автобокс может происходить только от примитива к его оболочке (например, int до Integer), а не от массива примитива к массиву соответствующей оболочки.Аналогичный случай с 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                        
1 голос
/ 29 декабря 2011

То, что вы передаете, ваш метод не соответствует ожидаемому.Вы устанавливаете i как массив Integer объектов.Затем вы передаете его методу test().Единственный метод test, который вы определили, - это ожидание типа int, который является примитивным типом ( Integer! = Int ).Вы можете быстро исправить это, изменив определение функции теста на:

public static void test(Integer[] s){
1 голос
/ 29 декабря 2011
int[].class != Integer[].class. 
int[].class = class [I
Integer[].class = class [Ljava.lang.Integer;

Вот почему он жалуется.

...