簡體   English   中英

Java:為什么我不能將數組聲明為簡單的Object?

[英]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 Objectsone-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 )和編譯器將檢查的類型12抵靠型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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM