12

在Java中,我可以编译

Object[] obj = {new Object[1], new Object[2]};

但我无法编译

Object obj = {new Object(), new Object()};

在第一个示例中,我声明 a one-dimensional arrayofObjects并为其分配 a two-dimensional array。在第二个中,我声明一个Object并为其分配一个一维数组。

如果 Java 数组 extends Object,为什么第二个代码片段不编译?为什么是第一个?

4

4 回答 4

13

将数组分配给对象不是问题,但是您必须像这样创建数组

Object obj = new Object[] { new Object(), new Object[2] };

否则编译器不会知道它是一个对象数组而不是其他类型的数组。

于 2013-02-02T18:05:18.253 回答
9

因为Array不仅仅是Object. 数组还具有语言级别的语义和语法

另外,您的第二个示例引出了一个问题:对象将在哪里存储您尝试初始化它的那两个东西?您刚刚声明了一个对象,但它没有命名字段,并且缺少数字索引的插槽数组。

您的第一个示例可以编译,因为您已经声明了一个数组Object(也就是说,对象引用),并且您为其初始化该数组的元素是对象引用(对您通过创建的单元素数组的引用new Object[1])。

这也可能有所帮助:Java 并没有真正的二维数组,尽管有一些方便的语法使它看起来像它。它具有(一维)数组的(一维)数组(……你明白了)。

于 2013-02-02T18:04:02.847 回答
1

问题是,当您使用初始化程序创建数组时,编译器需要通过根据提供的类型检查元素的类型来确保初始化程序中的所有元素都具有相同的提供类型。

也就是说,在初始化数组时总是需要提供类型信息。否则,编译器不知道如何验证数组初始化是否有效,从而给出illegal initializer error.

将数组分配给对象没有问题。例如,您可以执行以下操作:

int[] arr = {1,2};
Object obj = arr;

以下代码将无法编译:

Object obj = {1,2};

因为您没有明确提供编译器需要验证初始化程序中的值的元素类型。这是 Java 中数组初始化所必需的。

以下代码将编译:

Object[] obj = {1,2};

因为提供了元素的类型(即Object),编译器将根据类型检查1,2的类型Object(由于Integer是 的子类型,因此成功Object)。

于 2013-02-02T22:01:08.900 回答
0

你不能编译

Object obj = {new Object(), new Object()};

因为 obj 不是数组,所以这样声明

Object[] obj = {new Object(), new Object()};

或者

Object obj = new Object[] { new Object(), new Object() };

在以下对话后编辑

于 2013-02-02T18:05:43.067 回答