[英]Java : Why can't I declare an array as a simple Object?
在Java中,我可以编译
Object[] obj = {new Object[1], new Object[2]};
但我无法编译
Object obj = {new Object(), new Object()};
在第一个例子中,我声明了one-dimensional array
Objects
的one-dimensional array
,并为它分配了一个two-dimensional array
。 在第二个我声明一个Object
并为其分配一维数组。
如果Java数组扩展了Object
,为什么第二个代码片段不能编译? 为什么第一个?
将数组分配给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() };
在下面的对话后编辑
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.