0

假设这段代码:

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[];没有特殊待遇。

4

1 回答 1

6

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

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

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

于 2012-09-28T15:59:56.453 回答