尴尬的Var-args论点

时间:2012-09-28 15:58:12

标签: java variadic-functions

假设此代码:

public class Test{

    public static void main(String[] args) {
        Test.testInt(new int[]{2,3});
        Test.testInteger(new Integer[]{2,3});
    }

    public static void testInt(Object... elements){
      System.out.println(elements[0] instanceof int[]);
    }

    public static void testInteger(Object... elements){
      System.out.println(elements[0] instanceof Integer);
    }

}

在这两种情况下,人们都希望有一个包含2和3的一维数组。 所以预期的输出应该是第一眼:

false
true

惊喜!实际输出是:

true
true

更新此帖:

实际上,这不是一个好问题,因为我没有意识到这种情况符合Var-args规则。

总而言之,即使Var-args是参数,int []数组也不能自动装箱到Integer [];没有特别的待遇。

1 个答案:

答案 0 :(得分:6)

你不能将原始数组自动装箱到“包装”数组:数组是完全不同的类型! autoboxing原语有一些非常明确的用例。数组不存在这些用例。

您的方法签名要求至少一个Object,并且您提供了一个:int[]。您的方法签名还允许您提供与Integer[]一起使用的数组。

还值得指出的是,可以使用参数类型的数组调用所有varargs方法,这就是您使用Integer进行的操作。由于int不是Object,因此您的编译器会将数组视为Object