[英]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.