2010-03-04 62 views
7

我看有以下一些形式的Java類:這個Java泛型範例做了什麼,它叫什麼?

 

public 
abstract 
class A <E extends A<E>> implements Comparable <E> { 

    public final int compareTo(E other) { 
     // etc 
    } 
} 

public 
class B extends A <B> { 
    // etc 
} 

public 
class C extends A <C> { 
    // etc 
} 

 

我的「可比」這裏使用的是隻是爲了說明一個可能的使用泛型參數「E」的。這種泛型/繼承的用法是否有名字?它是幹什麼用的?

我的印象是,這允許抽象類提供一個方法的公共實現(比如compareTo),而不必在子類中提供它。但是,在本例中,與繼承方法不同,它將限制子類在相同子類的其他實例上調用compareTo,而不是任何「A」子類。這聽起來正確嗎?

無論如何,只是好奇,如果任何專家在那裏看到這個,並知道它做了什麼。

謝謝!

回答

4

在C++中,它被稱爲Curiously Recurring Template Pattern(CRTP)。我不知道它是否在Java中有不同的名稱(或者即使它有一個名稱),但它可能用於類似的目的。

+0

該維基頁面基本上是我正在尋找的解釋,謝謝!我發現關於編譯時「靜態」多態的說明頗爲有趣。 – Tom 2010-03-04 23:20:43

+1

這裏有一個很好的面向Java的討論:http://madbean.com/2004/mb2004-3/尋找標題「更多技巧與類型參數」 – 2010-03-30 19:47:24

+0

網址[應該被包括在一個答案只作進一步閱讀](http://meta.stackexchange.com/q/8259)。這個答案似乎嚴重依賴於URL的內容,並且可以從答案中包含的網址摘要中受益。 – 2013-12-28 09:00:06

0

我相信它通常被稱爲遞歸泛型類型。正如湯姆霍金指出的那樣,你可能想要A級< E擴展A <E> >。這種模式最突出的用途是java.lang.Enum(你可能知道考慮到你選擇了Comparable <E>作爲你的接口)。

+0

不,你不會。你應該使用'A '。 – newacct 2013-12-29 00:18:28

0

它沒有名稱,通常沒有用。大概誰寫它的人並沒有意識到,他們可以寫這樣的而不是:

class A<E> implements Comparable<E> 

我的印象是,這使得抽象類提供的方法的 常見的實現(如的compareTo)而不需要 在子類中提供它。

不任何超過class A<E>

然而,在該例中,與繼承的方法將限制 子類在同一 子類的其他實例調用的compareTo,而不是任何「A」子類。這聽起來正確嗎?

不,這是不正確的。它限制它在E上調用compareTo,無論是E是。