尴尬的Var-args论点

Mik*_*378 0 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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

false
true
Run Code Online (Sandbox Code Playgroud)

惊喜!实际输出是:

true
true
Run Code Online (Sandbox Code Playgroud)

本次更新的最新消息:

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

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

Dav*_*ant 6

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

你的方法签名要求至少一个Object,你提供了一个:int[].您的方法签名还允许您提供一个数组,您可以使用它Integer[].

值得指出的是,所有varargs方法都可以使用参数类型的数组来调用,这正是您正在使用的Integer.由于int不是Object,您的编译器将数组视为Object.