varbox的unboxing包装类

时间:2011-12-29 15:45:40

标签: java arrays oop boxing

为什么这会因编译失败而失败?

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 个答案:

答案 0 :(得分:3)

int s的数组不是Integer的数组。并且编译器尝试在引擎盖下执行此操作。所以你不能做你想做的事。

您可以坚持使用一种类型的数组,也可以使用来自commons-lang的ArrayUtils.toPrimitive(..)

答案 1 :(得分:2)

这是因为自动装箱只能从原语到它的包装器(例如intInteger),而不是从原语的数组到相应包装器的数组。与自动装箱相似的情况。

e.g。如果您按如下方式定义测试方法:

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                        

答案 2 :(得分:1)

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

这就是它抱怨的原因。

答案 3 :(得分:1)

您传递的方法与预期的定义不符。您将i设置为Integer个对象的数组。然后将其传递给方法test()。您定义的唯一方法test期望一个int是一个基本类型( Integer!= int )。您可以通过将test的函数定义更改为:

来快速解决此问题
public static void test(Integer[] s){