这样可行:
int i;
Object a = (Object) i;
int[] t;
Object b = (Object) t;
String[] s;
Object[] t = (Object[]) s;
但这不是:
int[] t;
Object[] z = (Object[]) t;
总而言之,我得到第一部分(拳击),但我发现第二部分不起作用非常不直观。是否有一个特定的原因(除了继承自Object的String和int不继承自Object)?
编辑:
要优化我的问题,这也有效:
int a = 2;
int b = 3;
int c = 4;
int d = 2;
Object[] o = new Object[] {a,b,c,d};
但接下来没有:
int[] t = (int[]) o;
令人惊讶的是,你遇到了与String相同的问题:
String sa = "a";
String sb = "b";
String sc = "c";
String sd = "d";
Object[] so = new Object[] {sa,sb,sc,sd};
String[] st = (String[]) so;
在最后一行产生一个类强制转换异常。这仍然有效:
Object[] sy = (Object[])new String[]{sa,sb,sc,sd};
String[] sz = (String[]) sy;
答案 0 :(得分:5)
int[]
是基元的数组,但也是对象本身。它不是一个对象数组
阵列没有自动装箱支持。您需要选择正确的数组类型,而不是在运行时转换它。
答案 1 :(得分:2)
包括int[]
在内的任何数组实际上都是Object
。这就是你可以强制转换为Object的原因。但是,int
是原始的,因此它不会延伸Object
,因此您无法转换为Object[]
。
答案 2 :(得分:1)
正如你所说:继承自Object的字符串和int不继承自Object,这就是原因。 int,boolean,double ...是原始类型,它们不从Object扩展。您应该使用Integer而不是int。
Integer[] t;
Object[] z = (Object[]) t;
答案 3 :(得分:1)
对象是类实例或数组。
JLS section 4.3.1中说明了这一点。
现在,int[]
是一个数组,它是一个对象。
String[] s;
和
int[]
以下方式有所不同:
前者可以指向String
个对象的数组,但后者可以指向原始int
的数组。
答案 4 :(得分:0)
我刚刚找到了自己寻找的答案。您无法将int[]
强制转换为Object[]
的原因不是因为int是基元且不扩展Object
,而是因为int[]
本身不会扩展Object[]
。在代码中:
int[] t = new int[0];
Object ot = t;
System.out.println(ot instanceof Object[]);
// --> prints 'false'
String[] s = new String[0];
Object os = s;
System.out.println(os instanceof Object[]);
// --> prints 'true'
编辑:拳击是必要的,因为Eclipse知道int[]
和Object[]
不兼容。
编辑II:顺便说一下,if(obj instanceof Object[])
允许检查盒装数组是否是基本类型的数组。
答案 5 :(得分:0)
根据Java Spec 4.10.3 Subtyping among Array Types:
- 如果S和T都是参考类型,那么S []> 1 T [] iff S> 1 T.
对象> 1 对象[]
如果P是基本类型,则对象> 1 P []
S> 1 T表示T是S的直接子类型
它基本上意味着,int []和Integer []在Java中的类型层次结构的不同分支中,并且不能相互转换。