为什么这会因编译失败而失败?
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);
答案 0 :(得分:3)
int
s的数组不是Integer
的数组。并且编译器尝试在引擎盖下执行此操作。所以你不能做你想做的事。
您可以坚持使用一种类型的数组,也可以使用来自commons-lang的ArrayUtils.toPrimitive(..)
。
答案 1 :(得分:2)
这是因为自动装箱只能从原语到它的包装器(例如int
到Integer
),而不是从原语的数组到相应包装器的数组。与自动装箱相似的情况。
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){