我使用了这段代码。我很困惑为什么这个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
答案 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]