2012-07-15 51 views
6

假設我有一個基本的枚舉,如:Java的:一般只接受枚舉類型

public enum Color { Red, Green, Blue} 

一個怎樣寫一個通用類只接受「枚舉類」,使得通用類的具體實例可能看起來像MyClass<Color>

編輯:

什麼是真正想要做的是寫一個包含一個函數返回的所有枚舉「項」爲列表中的泛型抽象類:

public abstract class EnumListBean<E extends Enum<E>> { 

    public List<E> getEnumList() { 
     return Arrays.asList(E.values()); 
    } 

} 

雖然Day.values()可用E.values()是不。我在這裏做錯了什麼?

+0

沒有其實施不應僅限於一個具體枚舉類型,但任意枚舉類型。我只是用'Day'來更具體地描述我想要的東西。 – Paranaix 2012-07-15 11:49:57

回答

5
public class EnumAcceptor<E extends Enum<E>> { 
    ... 
} 

使用電子郵件作爲你的類中的類型。

1

enum確實聲明瞭從Enum派生的類。因此,你可以使用:

public class MyClass<T extends Enum> { } 
+2

您正在混合泛型和原始類型。 – 2012-07-15 12:47:44

4

請參閱Istvan Devai以回答原始問題。

對於後續,像values()這樣的方法是靜態方法,所以你運氣不好,試圖從一個泛型參數中獲取它。作爲一個糟糕的解決方案,您可以將枚舉的Class對象傳遞給構造函數。並使用​​。但你也可以將MyEnum.values()傳遞給構造函數而不是類,因此完全避免反射。這是一個真正的恥辱,沒有一個明智的枚舉元類。

0

請注意,@ Istvan的解決方案只能接受元素enum,如果這就是你想要的,那很好。

雖然你無法通過enum本身作爲參數(因爲它實際上並沒有一個對象當量),你可以指定你必須接受enumclass在構造函數和導出enum的從細節:

public class EnumAcceptor<E extends Enum<E>> { 
    public EnumAcceptor(Class<E> c) { 
    // Can get at the enum constants through the class. 
    E[] es = c.getEnumConstants(); 
    } 

    enum ABC { 
    A, B, C; 
    } 

    public static void main(String args[]) { 
    EnumAcceptor<ABC> abcAcceptor = new EnumAcceptor<ABC>(ABC.class); 
    } 
} 
+0

糟糕 - @湯姆的帖子的副本 - 對不起湯姆:( – OldCurmudgeon 2012-11-30 14:48:58

0

不能使用E.values()由於類型擦除 - 的E類型是不可用在運行時。

對於你的問題的特定情況下,你可能會更好過使用GuavaLists.newArrayList

List<Color> days = Lists.newArrayList(Color.values());