繁体   English   中英

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

[英]Why is this int array not passed as an object vararg array?

我用过这段代码。 我很困惑为什么这个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

您遇到了一个边缘情况,其中对象和基元不能按预期工作。 问题是实际代码最终需要static void print(Object[]) ,但int[]不能转换为Object[] 但是它可以强制转换为Object ,从而产生以下执行代码: print(new int[][]{array})

通过使用基于对象的数组(如Integer[]而不是int[]可以获得所期望的行为。

原因是int数组不能隐式地转换为Object数组。 所以你实际上最终将int数组作为Object数组的第一个元素传递。

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

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

输出:

 Object…: 9 true 

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

Oracle文档告诉我们,对象或基元的数组也是一个对象:

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

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

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);
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM