2013-12-18 91 views
21

有什麼用方法聲明這樣的區別:T延伸SomeClass有什麼意義?

public <T extends SomeClass> void doSomething(T obj) 
{ 
    // Do something. 
} 

而且這樣的:

public void doSomething(SomeClass obj) 
{ 
    // Do Something. 
} 

我看來,兩者都被指定在傳遞的對象必須是辦法SomeClass類型的子類,所以在這種情況下,爲什麼還要用泛型?

+3

我經常想到這個,但沒有足夠的勇氣要求害怕可怕的{-1} s。所以+1。 – Bathsheba

+3

說「java泛型完全無用」是一個大膽而不正確的陳述。我不否認他們有缺陷並且功能齊全,但這並不會使他們無用 –

+1

好神,對不起,我似乎無法閱讀,所以我要回家了。在上面的情況下,沒有意義,但在其他特定情況下,它可能是有用的,根據下面micha的答案。這個實現是針對開發人員而不是計算機的,對於那些恰巧對人有用的情況! – RossC

回答

26

在你的情況下,它沒有太大的區別。

但考慮以下幾點:

public <T extends SomeClass> void doSomething(List<T> obj) 

在這種情況下,你可以調用的方法有以下幾種:

obj.doSomething(new ArrayList<SubclassOfSomeClass>()); 
obj.doSomething(new ArrayList<SomeClass>()); 

如果你會使用

public void doSomething(List<SomeClass> obj) 

你只會是能夠做到這一點:

obj.doSomething(new ArrayList<SomeClass>()); 
+0

這是一個很好的觀點!我沒有想到這一點。 – christopher

+2

但是對於這個特定的例子,'public void doSomething(List <?extends SomeClass> obj)'會很好。 –

+1

@PaulBellora除非有第二個參數'public void doSomething(List obj,T bar)' –