2012-06-05 93 views
-2

我有一個考試即將到來,我正在學習......並且我正在考慮一個優雅的方式來回答以下問題,我當前的答案會是類似的(基於此信息,來自於此計算器上的answer理論:列表聲明Object list = new ArrayList();

上面的初始化是不可能的,它會進行編譯,但是在聲明中缺少一個標識符,而其他函數(如add,remove)將不可用。

的問題..

考慮下面的代碼片段。是否可以將一個ArrayList的實例分配給一個聲明爲Object的變量,如第1行所示?說明。

Object strings = new ArrayList(); 

    strings.toString(); 

有什麼其他的方法來回答這個問題?你能提供維基百科/資源,所以我可以進一步研究編譯器如何將其轉換爲字節碼?謝謝

+2

而不是張貼代碼的圖像,只需發佈​​代碼。 – Jeffrey

+1

順便說一句,它編譯:http://ideone.com/3NAbz – Naveen

+1

這似乎是一個非常簡單的問題(特別是在考試時),看看代碼編譯之前明確表示它沒有。 –

回答

2

請考慮下面的代碼片段。是否可以將一個ArrayList的實例分配給一個聲明爲Object的變量,如第1行所示?說明。

Object strings = new ArrayList(); 

    strings.toString(); 

是的,它是可能的。 Object是一個超類型的ArrayList(實際上,Object是所有Java引用類型的超類型)。聲明一個變量爲所分配的實際類型的超類型是合法的。

List<String> list = new ArrayList<String>(); 
+0

謝謝! :-)我打算對超類型做更多的研究。 :P – Killrawr

+0

我會稍微修改答案:*「實際上,Object是所有Java **引用類型的超類型**」*。挑剔的考官可能會說,數組不是類,它可能會或可能不會是真實的,這取決於您使用的術語。使用官方的Java術語「引用類型」可以消除任何可能的謬誤。 –

1

它編譯(?你嘗試的話),但所產生的ArrayList是很難使用,因爲它被聲明爲:

當你定義一個List與具體落實ArrayList發生類似的情況成爲一個對象。例如,行:

strings.add("hello"); 

不會編譯,因爲add()未定義類型對象。但是,

((List)strings).add("hello"); 

確實編譯。

+0

謝謝,是的,我已經測試它可以在日食上編譯,但我有一些來自[這裏]的研究(http://stackoverflow.com/questions/2516778/java-how-to-have-an-arraylist-as-instance - 對象的變量)並基於這個問題..我認爲它會編譯,謝謝澄清。 – Killrawr

+1

@Killrawr:鏈接帖子使用泛型(位於< >內部的位),但沒有聲明變量名稱。看看我答案中的最後一個代碼塊,查看正確的泛型示例。 (你原來的問題沒有在示例代碼中使用泛型)。 –

+0

@GregKopff哦好點。我想過定義字符串或數據類型列表而不是對象列表。會很好,因爲從列表中檢索的對象不必被轉換。 – Killrawr

相關問題