为什么可以将int []转换为Object,而不是转换为Object []?

时间:2012-10-31 09:26:37

标签: java arrays casting primitive

这样可行:

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;

6 个答案:

答案 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中的类型层次结构的不同分支中,并且不能相互转换。