2013-02-18 125 views
2

我是新來的Java,並試圖從Java泛型和集合書中瞭解下面的好奇語法..(我廣泛使用C++模板,因此可以聲稱瞭解泛型編程的基礎知識和可能的陷阱):「?extends E」和「T extends E」之間有什麼區別?

interface Collection <E> { 
    ... 
    public boolean addAll(Collection<? extends E> c); 
    ... 
} 

爲什麼不能在上面寫爲:

interface Collection <E> { 
    ... 
    public boolean addAll(Collection<T extends E> c); 
    ... 
} 

的區別是什麼?這僅僅是語言限制還是在引擎蓋下有什麼區別?

回答

6

它可以寫成

public <T extends E> boolean addAll(Collection<T> c) 

但就沒有任何意義。沒有必要命名該參數。

+2

你的意思是'公衆布爾addAll(收集 C);' – 2013-02-18 18:44:46

+1

我低估了這個把你的注意力引向我以前的評論。 – 2013-02-18 18:50:23

+0

現在已經修復。 – 2013-02-18 18:57:03

3

如果該方法返回T類型的東西,那麼這將會有意義。然後,您可以匹配這兩種類型。但是它只是返回一個布爾值,所以你不需要那樣做。那麼就沒有必要設置一個名字T,它仍然只是一個問號。

假設中的addAll需要一個過濾器:

public <T extends E> boolean addAll(Collection<T> c, Predicate<T> aFilter); 

現在你知道謂詞已經可以在類集c操作泛型類型。

相關問題