2013-11-01 34 views
1

好吧,我在這個網站上看到這個問題,它沒有回答我的主要觀點。泛型有什麼區別

假設我們有這樣的:

public <T extends Number> void someMethod(List<T> list) 

public void someMethod(List<? extends Number> list) 

考慮到我不需要束縛任何下限或上限列表。所以拒絕這些事情,在這種情況下有什麼區別?因爲?是未知列表,T是T列表,但從一方面來看它們在這種情況下是類似的(上面的方法)。

(詩我知道這之間的差異,但在這種情況下,它看起來對我來說非常相似,因爲我認爲這不要緊,用什麼。)

+0

你不能添加元素到'List <?擴展Number>'。 –

+0

是的,這是真的,現在我明白了。謝謝 – Ernusc

回答

7

這裏:

public <T extends Number> void someMethod(List<T> list) 

你可以在你的代碼中使用未知類型T.例如:

T obj = list.get(0); 
list.add(obj); 

這是不可能在這裏:

public void someMethod(List<? extends Number> list) 
+0

在通配符中我可以使用數字的子類型,在我的泛型類型中是否相同? – Ernusc

+0

對不起,我不明白你的問題。 –

+0

@Ernusc首先聲明您可以在方法簽名中使用'T'作爲類型,而不必使用'Number'(並且如果需要,您可以在將來更容易地更改它) –

1

列表<? extends Number>意味着什麼,在這裏延伸數。 所以假設你有類,如

public class Example<T extends Number> { 

public <T extends Number> void someMethod(List<T> list) ... 

public <T extends Number> void someOtherMethod(List<T> list) ... 

} 

public class SomeClass extends Number { 
} 

public class SomeClass2 extends Number { 
} 

,並創建一個實例一樣

Example<SomeClass> myExample = new Example<SomeClass>(); 

所以,當你想在這裏用你的方法,輸入參數必須是insances完全相同的類SomeClass的的,我們不能在這裏使用SomeClass2。例如,以下是無效的:

List<SomeClass2> someClass2 = new ArrayList<SomeClass2>(); 
example.someMethod(someClass2); 

但如果你使用<? extends Number>作爲輸入參數的someMethod則是可能的。您可以傳遞任何擴展Number,someClass2或3,4或任何其他類的任何內容。

+0

謝謝,這個例子使一切更清晰。 :) +1 – Ernusc