2014-03-12 33 views
6

我很難理解Java泛型中的通配符。具體來說,我有以下問題:瞭解Java中的通配符

  1. 如果我們有一個LinkedList<?>,我們爲什麼不能添加Object呢?我知道它不知道列表的類型,但是不會在列表中添加Object讓我們在任何情況下都可以覆蓋?

  2. 與上面的問題類似,如果我們有LinkedList<? extends Number>,爲什麼我們不能add a Number它呢?

  3. 最後,如果我們有LinkedList<? super Number>,爲什麼我們add一個Integer到列表中,我們不應該只能夠添加東西,都是數的超?

我想我想了解通配符的一般工作原理,我讀過他們的Oracle教程和其他一些東西,但我不明白爲什麼他們的工作,我想。

+0

列表表示該列表可能包含任何內容,但所有這些內容都屬於同一類型。既然你不知道他們是什麼,你不能添加一個。 – deanosaur

+0

出於某種原因,我正在考慮UNIX外殼通配符。 – hcaulfield57

回答

5

你在混淆物體和類型。
與簡單通用參數不同,通配符描述泛型參數的類型
A List<? super Number>不是Number的超類列表;它是一個未知類型的列表,其中該類型是數字的超類。可以是LinkedList<Car>
由於Object不是Car,因此無法向其添加Object

事實上,既然你不知道什麼關於列表包含什麼類型,你不能添加任何東西。 (除了null

同樣,LinkedList<? extends Number>可能是List<Long>,所以您不能將Integer添加到它。 (因爲一個Integer不是Long

在另一方面,一個List<? super Number>絕對允許包含Number或任何派生類,因爲它只能是Number的超類中的一個的列表(例如,List<Object>

+0

感謝您的回答,這對我來說更有意義,但我仍然試圖理解爲什麼可以將'Number'的子類添加到'List <?超級數字>',當我們添加一些東西到'List <?超級數字>',它把它當作'Object'嗎? – hcaulfield57

+0

它不會「視它」爲任何東西。無論Number是什麼超類,該列表實際上都是_of_,它當然可以擁有一個Number。 – SLaks

+0

好的,但是如果你把'Integer'加到'List <?超級數字>',那不是'數字'的超類,所以如何添加它,還是我錯過了某些東西? – hcaulfield57