2013-12-23 166 views
4

我一直在尋找一個差異,看到這樣的代碼:Java泛型擴展

public interface Vector<T extends Vector> 

這是由以下代碼取代:

public interface Vector<T extends Vector<T>> 

我有麻煩纏繞我的周圍的頭,什麼是區別?他們如何工作不同?

+2

我覺得這個頁面應該回答您的所有問題:HTTP:/ /stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it – robbmj

+1

其實它回答我的問題,我有時有麻煩解析Java泛型參數化的語言在狂野。知道這是一個原始類型幫助我從ArrayList vs ArrayList 等角度考慮它。 – talloaktrees

+0

非常有趣的遞歸泛型。 –

回答

-1

這兩個聲明之間的區別在於第一個聲明會產生編譯器警告,第二個聲明不會。這是因爲泛型類型應該總是和參數一起使用。

該聲明確保如果X實現矢量它必須是X的向量:

class X implements Vector<X> { 
... 

任何東西都不會產生一個編譯錯誤。

其實這種結構用於在JDK:

public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable { 
... 

這意味着,當我們聲明枚舉X它(隱含的)延伸Enum<X>

+0

「這個聲明確保瞭如果X實現了Vector,它必須是X的Vector」否,它不會。現在我們可以使'Y類實現矢量' – newacct

+0

'Y類實現向量給出編譯錯誤 –

+0

不,它不,如上面定義的類'X'。你甚至嘗試過嗎? – newacct