在Java中,我可以编译
Object[] obj = {new Object[1], new Object[2]};
但我无法编译
Object obj = {new Object(), new Object()};
在第一个示例中,我声明one-dimensional array
Objects
并为其分配two-dimensional array
。在第二个我宣布一个Object
并为其分配一维数组。
如果Java数组扩展Object
,为什么第二个代码片段不能编译?为什么第一个?
答案 0 :(得分:12)
将数组分配给Object不是问题,但您必须像这样创建数组
Object obj = new Object[] { new Object(), new Object[2] };
否则编译器不会知道它是一个Object数组而不是其他类型的数组。
答案 1 :(得分:9)
因为Array
不仅仅是Object
的子类。数组也有language-level semantics and syntax。
另外,你的第二个例子引出了一个问题:对象在哪里存储你试图初始化它的那两件事?您刚刚声明了一个对象,但它没有命名字段,并且没有数字索引的插槽数组。
你的第一个例子编译是因为你已经声明了一个Object
数组(也就是说,对象引用),你给它初始化那个数组的元素是对象引用(对单个引用您通过new Object[1]
创建的元素数组。
这也可能有所帮助:Java实际上没有二维数组,尽管有一些方便的语法使它看起来像它。它有(单维)数组(单维)数组(你得到了这个想法)。
答案 2 :(得分: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
)的子类型。
答案 3 :(得分:0)
你无法编译
Object obj = {new Object(), new Object()};
因为obj不是数组因此声明如此
Object[] obj = {new Object(), new Object()};
或
Object obj = new Object[] { new Object(), new Object() };
在以下对话后编辑