为什么此int数组不作为对象vararg数组传递?

Joe*_*yon 17 java

我用了这段代码。我很困惑为什么此int数组未转换为对象vararg参数:

class MyClass {
    static void print(Object... obj) {
        System.out.println("Object…: " + obj[0]);
    }

    public static void main(String[] args) {
        int[] array = new int[] {9, 1, 1};
        print(array);
        System.out.println(array instanceof Object);
    }
}
Run Code Online (Sandbox Code Playgroud)

我期望输出:

Object…: 9
true
Run Code Online (Sandbox Code Playgroud)

但它给出:

Object…: [I@140e19d
true
Run Code Online (Sandbox Code Playgroud)

Kis*_*kae 21

您遇到了一个极端的情况,即对象和基元无法按预期工作。问题在于实际的代码最终会达到预期的效果static void print(Object[]),但int[]无法转换为Object[]。但是,可以将其强制转换为Object,从而导致执行以下代码:print(new int[][]{array})

你得到你所期望通过使用基于对象的数组一样的行为Integer[],而不是int[]


ruo*_*ola 8

这样做的原因是int无法将Object数组隐式转换为数组。因此,您实际上最终将int数组作为数组的第一个元素传递Object

如果您这样做,则可以在不更改main方法和参数的情况下获得预期的输出:

static void print(Object... obj) {
    System.out.println("Object…: " + ((int[]) obj[0])[0]);
}
Run Code Online (Sandbox Code Playgroud)

输出:

Object…: 9
true
Run Code Online (Sandbox Code Playgroud)