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;

总而言之,我得到了第一部分(拳击),但我发现第二部分不起作用是非常不直观的。是否有特定的原因(除了从 Object 继承的 String 和不从 Object 继承的 int )?

编辑:

为了完善我的问题,这也有效:

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;
4

6 回答 6

5

A int[] is an array of primitives but also an Object itself. It is not an array of Objects

There is no auto-boxing support for arrays. You need to pick the right type of array to start with and not be converting it at runtime.

于 2012-10-31T09:28:38.050 回答
2

Any array, including int[] is actually an Object. This is why you can cast to Object. However, int is a primitive, so it doesn't extend Object, so you cannot cast to Object[].

于 2012-10-31T09:28:45.890 回答
1

对象是类实例或数组。

JLS第 4.3.1 节中对此进行了说明。

现在,int[]是一个数组,它是一个对象。

String[] s; 

int[]

有以下不同:

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

于 2012-10-31T09:36:29.350 回答
1

正如您所说:String 继承自 Object 而 int 不继承自 Object,这就是原因。int、boolean、double... 是原始类型,它们不从 Object 扩展。您应该使用 Integer 而不是 int。

Integer[] t;
Object[] z = (Object[]) t;
于 2012-10-31T09:31:21.703 回答
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[]不兼容。

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

于 2012-10-31T12:25:29.627 回答
0

根据 Java Spec 4.10.3 Subtyping between Array Types

  • 如果 S 和 T 都是引用类型,则 S[] > 1 T[] 当且 S > 1 T。

  • 对象 > 1 个对象[]

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

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

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

于 2017-04-26T12:21:05.193 回答