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

时间:2019-05-11 17:37:07

标签: 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);
    }
}

我期望输出:

Object…: 9
true

但是它给出了:

Object…: [I@140e19d
true

5 个答案:

答案 0 :(得分:20)

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

通过使用像Integer[]这样的基于对象的数组而不是int[],可以得到期望的行为。

答案 1 :(得分:8)

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

如果您这样做,则无需更改main方法且无需更改参数即可获得预期的输出

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

输出:

Object…: 9
true

答案 2 :(得分:0)

如您所知,当我们使用varargs时,我们可以传递一个或多个以逗号分隔的参数。实际上,它是对数组的简化,Java编译器将其视为指定类型的数组。

Oracle documentation告诉我们,对象或基元数组也是对象:

  

在Java编程语言中,数组是对象(第4.3.1节),是   动态创建的,并且可以分配给Object类型的变量   (第4.3.2节)。可以在数组上调用Object类的所有方法。

因此,当您将int[]传递给print(Object... obj)方法时,您正在传递一个对象作为varargs的第一个元素,然后System.out.println("Object…: " + obj[0]);打印其引用地址(默认toString()个对象的方法)。

答案 3 :(得分:0)

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};
        // To boxed array
        Integer[] oArray = Arrays.stream( array ).boxed().toArray( Integer[]::new );

            print(oArray);
            System.out.println(oArray instanceof Object);
        }
    }

答案 4 :(得分:-1)

数组的toString()返回[Array type @ HashCode HashCode是从数组计算得出的数字。 如果要获取有用的字符串,则应改用java.util.Arrays.toString(array)

例如

System.out.println(new int[10].toString());
System.out.println(java.util.Arrays.toString(new int[10]));

产生

[I@72d818d1
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]