为什么可以将int[]转换为Object,但不能转换为Object[]?

3

因此,这是有效的:

int i;
Object a  = (Object) i;
int[] t;
Object b = (Object) t;
String[] s;
Object[] t = (Object[]) s;

但这个不行:
int[] t;
Object[] z = (Object[]) t;

总的来说,我理解了第一部分(boxing),但是我觉得第二部分完全没有效果非常不直观。除了String继承自Object而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 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;

int 不继承自任何类。 - user647772
1
数组是对象;一个整数数组是一个数组,因此也是一个对象。整数不是对象,因此一个整数数组不是一个对象数组。 - ignis
6个回答

5

一个 int[] 是一个原始类型的数组,同时也是一个对象本身。它不是一个对象的数组。

数组没有自动装箱支持。你需要选择正确的数组类型并在运行时不进行转换。


2

任何数组,包括int[]实际上都是一个Object。这就是为什么你可以将其转换为Object。但是,int是一个原始类型,因此它不扩展Object,所以你不能将其转换为Object[]


1

正如你所说:String继承自Object,而int不继承自Object,这就是原因。int、boolean、double等都是基本类型,它们不是从Object继承的。你应该使用Integer而不是int。

Integer[] t;
Object[] z = (Object[]) t;

1
一个对象是类实例或数组。这在JLS 第4.3.1节中说明。现在,int[]是一个数组,也是一个对象。
String[] s; 

并且

int[]

以下是它们的不同之处:

前者可以指向一个String对象数组,而后者可以指向一个原始的int数组。


正确的链接是http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.3.1。 - kolobok

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'

编辑: boxing(装箱)是必要的,因为Eclipse知道int[]Object[]之间不兼容。

编辑II:顺便说一句,if(obj instanceof Object[])允许检查装箱数组是否为原始类型的数组。


1
回复:编辑 II:在该语句为真之前,您需要确保 obj 也是一个数组!但无论如何,我建议以下方式以满足未来读者(包括您)的好奇心:obj.getClass().isArray() && obj.getClass().getComponentType().isPrimitive()。如果您需要“黑客”,请好好“黑客” :) - TWiStErRob

0
根据Java规范4.10.3 数组类型之间的子类型关系
  • 如果S和T都是引用类型,则当S >1 T时,S[] >1 T[]。

  • Object >1 Object[]

  • 如果P是原始类型,则Object >1 P[]

S >1 T表示T是S的直接子类型

这基本上意味着,在Java中,int[]和Integer[]位于类型层次结构的不同分支中,不能相互转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接