使用方法Arrays.deepToString(Object [] a)时,我遇到了这个问题,我可以用这种方式解决。
Object [] not_allowed = new int[]{7, 9, 8};
Object [] allowed = new int[][]{{1, 2, 3}, {6, 5, 4}};
为什么我不允许在单维情况下将int []分配给Object [],但我可以在多维情况下执行此操作。
答案 0 :(得分:7)
像int
这样的原始类型不是对象,而数组是对象 - 您可以将任何数组分配给对象引用
Object o = new int[]{7, 9, 8};
new int[][]
是一个对象数组,因此可以分配给Object[]
。您可能想要编写这样的实用程序方法来执行您想要的操作:
public static String arrayToString(Object o) {
if(o instanceof Object[]) {
return Arrays.deepToString((Object[]) o);
}
else if(o instanceof long[]) {
return Arrays.toString((long[]) o);
}
else if(o instanceof int[]) {
return Arrays.toString((int[]) o);
}
else if(o instanceof short[]) {
return Arrays.toString((short[]) o);
}
else if(o instanceof byte[]) {
return Arrays.toString((byte[]) o);
}
else if(o instanceof float[]) {
return Arrays.toString((float[]) o);
}
else if(o instanceof double[]) {
return Arrays.toString((double[]) o);
}
else if(o instanceof boolean[]) {
return Arrays.toString((boolean[]) o);
}
throw new IllegalArgumentException("input is not an array");
}
示例:
Object intArray = new int[]{7, 9, 8};
Object[] intintArray = new int[][]{{1, 2, 3}, {6, 5, 4}};
Object[] intintintArray = new int[][][]{{{1, 2, 3}, {6, 5, 4}},
{{1, 2, 3}, {6, 5, 4}}};
System.out.println(arrayToString(intArray));
System.out.println(arrayToString(intintArray));
System.out.println(arrayToString(intintintArray));
输出:
[7, 9, 8]
[[1, 2, 3], [6, 5, 4]]
[[[1, 2, 3], [6, 5, 4]], [[1, 2, 3], [6, 5, 4]]]
答案 1 :(得分:5)
int
s不是Object
s,这就是为什么第一个赋值是非法的:int
s的数组不是Object
s的数组。
但是数组,无论是什么,都是对象。您已成功将外部数据结构(数组数组)分配给Object
的数组。
答案 2 :(得分:5)
小写int是一个原语,不从Object继承。请尝试使用Integer。
答案 3 :(得分:2)
第一个赋值不起作用,因为int []的元素类型是int,而不是Object。由于(您尝试分配给Object [],元素类型应该是Object,而不是int)
第二个赋值确实有效,因为int []是一个Object,因此int [] []是一个Object []。
答案 4 :(得分:1)
您的第一行无效:
Object [] not_allowed = new int[]{7, 9, 8};
这是因为int
不是Object
。这将是有效的:
Object allowed = new int[]{7, 9, 8};
答案 5 :(得分:0)
还有一点要提到的是允许的行
Object [] allowed = new int[][]{{1, 2, 3}, {6, 5, 4}};
实际上不应该是因为你应该能够用
来跟进它allowed[0] = "Surprise!";
因此设法将String
放入一个只应包含int[]
的数组中。这就是为什么Java必须在运行时检查数组元素的每个赋值,以确保指定的元素与数组的实际类型兼容,而不仅仅是让编译时类型检查处理它。因此,上面的代码会编译,但在尝试分配String
时会导致异常。
此问题也仅影响数组。当泛型添加到Java时,设计人员知道更好,而在泛型集合中,int[]
的集合不是Object
集合的子类型,因此,如果在您的示例中,您从数组切换到通用ArrayList
,比方说,两行都不会编译。