2012-07-26 13 views
13

Ich versuche, eine generische Klasse mit allen verfügbaren Werte von einem Enum zu initialisieren. Hier ist, wie ich es möchte arbeiten:Verwenden Sie Enum.values ​​in mit generischer Klasse Erweiterung Enum

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

    E[] choices; 

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

jedoch der Aufruf an E.values wird in Eclipse nicht akzeptiert zu sagen, dass diese Methode für diese E.

undefiniert diesen Konstruktor verwendet stattdessen akzeptiert wird, aber die Werte erfordert den Anrufer zur Verfügung zu stellen:

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

In der Dokumentation gefunden:

Java-Programmiersprachen-Enum-Typen sind viel leistungsfähiger als ihre Gegenstücke in anderen Sprachen. Die Enum-Deklaration definiert eine Klasse (Enum-Typ genannt). Der Enum-Klassenkörper kann Methoden und andere Felder enthalten. Der Compiler fügt beim Erstellen einer Enumeration automatisch einige spezielle Methoden hinzu. Zum Beispiel haben sie eine Methode für statische Werte , die ein Array zurückgibt, das alle Werte der Enumeration in der Reihenfolge enthält, für die sie deklariert sind.

Gibt es eine Möglichkeit, dieses Problem zu umgehen?

Antwort

20

Ihre beste Option ist wahrscheinlich, einen Class der gewünschten Enumeration an den Konstruktor zu übergeben. (Siehe zum Beispiel, wie ein EnumMap aufgebaut ist.)

Sie können dann clazz.getEnumConstants() verwenden, um die Konstanten zu erhalten.

3

Ihr erstes Code-Snippet funktioniert nicht, weil Generics in Java implementiert ist und aufgrund eines Phänomens, das als type erasure bekannt ist. Aus diesem Grund wird die JVM keine Ahnung haben, was der Typ E ist, wenn Ihr Programm ausgeführt wird.

Sie wahrscheinlich so etwas wie dies in MyClass ‚s Konstruktor tun könnten:

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

Ich glaube, das hat nichts mit Typ Löschung zu tun hat. Die Ursache des Problems liegt darin, dass die Methode 'public static E [] values ​​()' keine Methode in der Klasse 'java.lang.Enum' ist. [Die Java Language Specification] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2) erklärt, dass diese Methode synthetisch erzeugt wird für alle enums. So ist die Methode meiner Meinung nach in jeder konkreten Referenz eines Enums enthalten, aber nicht in der Enum-Klasse selbst. –

Verwandte Themen