2012-07-26 37 views
13

我想用Enum中的所有可用值初始化泛型類。這是我想它是如何工作的:在泛型類中使用Enum.values擴展枚舉

public class MyClass<E extends Enum<E>> { 

    E[] choices; 

    public MyClass() { 
     choices = E.values(); 
    } 

然而,調用E.values在Eclipse中是不能接受的話,這種方法是未定義此E.

使用此構造,而不是被接受,但要求調用者提供的值:

public MyClass(E[] e) { 
    choices = e; 
} 

在我找到的文檔:

Java編程語言枚舉類型比其他語言中的 對等更強大。枚舉聲明定義了一個類 (稱爲枚舉類型)。枚舉類的主體可以包含其他字段的方法和 。編譯器在創建枚舉時會自動添加一些特殊方法 。例如,它們有一個靜態值方法 ,該方法返回一個數組,其中包含枚舉的所有值,其排列順序爲 。

有沒有辦法解決這個問題?

回答

20

您的最佳選擇可能是將所需枚舉的Class傳遞給構造函數。 (見一個EnumMap是如何構造的實例。)

然後可以使用clazz.getEnumConstants()得到的常量保持。

3

您的第一個代碼片段不起作用,因爲泛型是如何在Java中實現的,以及由於稱爲type erasure的現象。因此,JVM將不知道程序執行時E的類型。

你也許可以做這樣的事情在MyClass的構造:

public MyClass(E type) { 
    choices = type.getDeclaringClass().getEnumConstants(); 
} 
+0

我相信這已經無關類型擦除。問題的原因是'public static E [] values()'方法不是'java.lang.Enum'類中存在的方法。 [Java語言規範](http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2)解釋說,這種方法是綜合生成的所有枚舉。所以,在我看來,該方法存在於枚舉的任何具體引用中,但不在枚舉類本身中。 – 2012-07-26 07:28:53