Nein eben nicht von der Klasse E, sondern vom Generic-Value E, welches eine x-beliebige Klasse sein kann die sich von Enum ableitet (also im Normalenfall ein Enum ), trotzdem ist das Generic zur Laufzeit weg
Das ist ja richtig, aber inwiefern ist das hier das Problem? Das E wird durch einen konreten Enum-Typ ersetzt.
Dieser kann aber doch zur Laufzeit abgefragt werden. Die Generics sollten hier doch nicht das Problem sein, oder?
Na das ist nicht so ganz einfach. Generics werden nicht an allen Stellen beim Kompilieren durch den konkreten Typen ersetzt. Z.B. wird aus:
Java:
classFoo<E>{privateE foo;}
nicht:
Java:
classFoo<Konkret>{privateKonkret foo;}
aber:
Java:
classFoo<Konkret>{privateObject foo;}
Anders ist es bei Signaturen von Methoden. Dort werden z.B. Rückgabewerte ersetzt. Ein Generic ist Typensicherheit zur Entwicklungszeit, damit ist es egal welche Klasse foo später hat, solange der Rückgabewert der Methoden (innerhalb von eigenen Klasse - z.B. Getter/Setter) stimmt um diese zu identifizieren.
Was du aber brauchst ist entweder die Klasse selber Class<E extends Enum> für Reflection oder die Instanz der Klasse (z.B. im Konstruktor übergeben).
edit: values wird vom Compiler beim kompilieren eines Enum automatisch angelegt. Es ist im Endeffekt nichts anderes als ein statischer Konstrukter, der ein Array mit allen Werten des Enum füllt. Daher ist sie im Javadoc auch nicht zu finden. Steht glaub ich nur im Text erwähnt. Ansonsten im JLS, im Bereich für Enums.
Das lässt sich allerdings noch nicht mal kompilieren. Wie müsste der Konstruktor aussehen?
Und mein zweites Problem: Wie lege ich fest, dass im Konstruktor nur das Enum übergeben werden darf, das auch bei der Klassendeklaration angegeben wurde?
Nein, das geht ja eben gerade nicht. Das ist ja das was faetzminator geschrieben hat.
Die von mir gepostete Version funktioniert jetzt.
Allerdings übergebe ich den Wert dort halt nur per Konstruktor, ich kann die Klasse selbst nicht entsprechend typisieren, um für Methoden diese Typen als Rückgabewerte zu definieren. Also auch noch nicht die ideale Lösung.
Das ist kein Rückgabewert, das ist die Angabe des Generic Types für den Konstruktor. Es ist und bleibt ein Konstruktor.
Aber lass uns bitte nicht ums Thema drum herum reden. Meine Anforderung habe ich immer noch nicht gelöst. Ich möchte für die Klasse den Generics-Typ angeben, der ein Enum sein muss. Ich muss im Konstruktor auf die möglichen Enum-Werte zugreifen können. Es soll sichergestellt sein, dass der im Konstruktor übergebene Enum der selbe Typ ist, wie bei der Klassendeklaration angegeben.