2013-02-22 85 views
-1

考慮下面的Java代碼:爲什麼無法將對象添加到列表<?超級號碼>?

List<? super Number> list = new ArrayList<>(); 
Number n = new Integer(1); 
Object o = new Object(); 
list.add(n); // works, apparently Number super Number is alright 
list.add(o); // compiler error! 

但是,爲什麼是這樣呢?因爲在內部,類型擦除使列表成爲一個列表,其中包含對象,爲什麼不允許將對象(它是所有類的超類,因此應該滿足下界的通配符)添加到列表中?

+0

這個確切的例子是,即使在這個問題...... – Woot4Moo 2013-02-22 17:05:29

回答

1

編譯器只知道list包含Number(或Number本身)一些超型,其可以是或可以不是Object。所以它必須禁止Object,因爲它可能是List<Number>

這裏是一個more thorough explanation,滾動大約一半的地方,它談論「超級」。

+0

感謝使用,想多一點和閱讀的鏈接之後,我知道了。 – Tilde 2013-02-22 17:39:02

+0

@downvoter:downvote的原因是什麼? – rgettman 2013-02-22 18:07:54

1

Object不是Number

A Number雖然是Object

這個問題的From the accepted answer是一個重複:

因此,它是不正確的,你可以數的任何超類型添加到列表 ;這根本不是如何限制通配符和捕獲轉換的工作。你不要聲明一個列表 因爲你可能想要添加一個對象(你不能!);你做 ,因爲你想添加Number對象(即它是Number的「消費者」 ),並且List只是太限制了。

0

List<? super Number> list定義了您可以分配給它的列表。

換句話說,你可以指定一個List<Number>List<Object>它。

據我所知new ArrayList<>()將是相同new ArrayList<Number>()

相關問題