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?
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. –
Wenn Sie zwei Klassen, 'public class A { \t \t public static void Test() {} }' und 'public class B { \t \t public B() {a.test(); } } ', die Zeile A.test() ist immer noch ein Kompilierzeitfehler, weil zur Laufzeit der Compiler den Typ von A nicht kennen würde, ohne explizit definiert zu sein, sagen wir als Parameter vom Typ A an den Konstruktor übergeben . – Jeshurun
@Jeshrun Nein, ist es nicht. Es ist ein Fehler bei der Kompilierung, weil das 'A' in Ihrer Deklaration' Klasse B 'ein unbeschränktes Argument ist. Das 'A' in dieser Deklaration hat nichts mit der Klasse' A' zu tun.Würde es kompilieren, wenn Sie es als "Klasse B" deklarieren, wo die Deklaration keine offensichtlichen Mehrdeutigkeiten zwischen dem Typparameter und dem Klassennamen hat und einen Verweis auf T verwendet? –