在Java中,我可以编译
Object[] obj = {new Object[1], new Object[2]};
但我无法编译
Object obj = {new Object(), new Object()};
在第一个示例中,我声明了Objects
的one-dimensional array
并为其分配了一个two-dimensional array
。在第二个中,我声明一个Object
并为其分配一个一维数组。
如果一个Java数组扩展Object
,为什么第二个代码片段不编译?为什么是第一个?
将数组分配给对象不是问题,但您必须像这样创建数组
Object obj = new Object[] { new Object(), new Object[2] };
否则,编译器不会知道它是一个 Object 数组,而不是某种其他类型的数组。
因为Array
不仅仅是Object
的子类。数组还具有语言级别的语义和语法。
另外,您的第二个示例引出了一个问题:对象将在哪里存储您尝试初始化它的这两个东西?您刚刚声明了一个对象,但它没有命名字段,并且缺少数组具有的数字索引插槽。
您的第一个示例编译是因为您已经声明了一个Object
数组(即对象引用),并且您为初始化该数组而提供的元素是对象引用(对你通过 new Object[1]
创建的单元素数组的引用)。
这也可能有所帮助:Java并没有真正的二维数组,尽管有一些方便的语法使它看起来像它。它具有(单维)数组的(单维)数组(的...你明白了)。
问题是,当您使用初始值设定项创建数组时,编译器需要通过根据提供的类型检查元素的类型来确保初始值设定项中的所有元素都具有相同的提供类型。
也就是说,在初始化数组时始终需要提供类型信息。否则,编译器不知道如何验证数组初始化是否有效,从而给出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
的子类型)。
无法编译
Object obj = {new Object(), new Object()};
因为 OBJ 不是数组,所以像这样声明
Object[] obj = {new Object(), new Object()};
或
Object obj = new Object[] { new Object(), new Object() };
在以下对话后编辑