Generics mit Enums

Status
Nicht offen für weitere Antworten.

hupfdule

Top Contributor
Hi, folgendes Codeschnipsel
Code:
public class Test<E extends Enum>{
  public Test(){
    for (E enumValue : E.values()){
      ...
    }
  }
}

scheitert, weil die Methode values() nicht gefunden wird.

Wo liegt mein Fehler?
Was kann ich tun, um hier die Werte des Enums abzufragen?

Vielen Dank für die Hilfe.
 

faetzminator

Gesperrter Benutzer
Du versuchst von der Klasse E eine statische Methode values() aufzurufen. Du brauchst eine Instanz, welche du bearbeiten kannst, z.B. so:
Java:
 public class Test<E extends Enum>{
  public Test(E e){
    for (E enumValue : e.values()){
      [...]
    }
  }
}
 

Noctarius

Top Contributor
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
 

Noctarius

Top Contributor
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:
class Foo<E> {
    private E foo;
}

nicht:
Java:
class Foo<Konkret> {
    private Konkret foo;
}

aber:
Java:
class Foo<Konkret> {
    private Object 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.
 
Zuletzt bearbeitet:

hupfdule

Top Contributor
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).

Hmm,
was mach ich denn dann nun? Wie muss der Konstruktor aussehen? Ich hätte es ja so versucht:
Java:
public class Test<E extends Enum>{
  public <Class <E extends Enum>> Test(E e){
    for (E enumValue : e.values()){
      ...
    }
  }
}

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?
 

Noctarius

Top Contributor
Java:
public class Test<E extends Enum> {
    public Test(E e) {
        for (E value : e.value()) {
            ...
        }
    }
}
 

hupfdule

Top Contributor
Ah, jetzt hab ich es:

Java:
public class Test{
   public <E extends Enum> Test(Class<E> enumType){
      for (E enumValue : enumClass.values()){
      }
   }
}
 

hupfdule

Top Contributor
Java:
public class Test<E extends Enum> {
    public Test(E e) {
        for (E value : e.value()) {
            ...
        }
    }
}

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.
 

hupfdule

Top Contributor
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.
 

Noctarius

Top Contributor
Jo stimmt hatte vorhin irgendwie was von Class<E extends Enum> ... gelesen. Vermutlich verlesen oder so, keine Ahnung.

Java:
public class EnumTest {
	public static enum Foo {
		First,
		Second,
		Third
	}

	public static class Bar<E extends Enum<E>> {
		public Bar(Class<E> e) {
			for (E value : e.getEnumConstants()) {
				System.out.println(value.name());
			}
		}
	}
	
	
	
	public static void main(String[] args) {
		new Bar(Foo.class);
	}
}

So geht es zumindestens
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Generics machen mich verrückt Java Basics - Anfänger-Themen 8
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
MarvinsDepression Datentypen Generics: Erste Berührungen Java Basics - Anfänger-Themen 6
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
Cassy3 Generics - CompareTo Java Basics - Anfänger-Themen 21
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
districon Generics implementieren Java Basics - Anfänger-Themen 2
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
G Generics Compilerfehler Java Basics - Anfänger-Themen 6
G Generics Methoden Java Basics - Anfänger-Themen 7
G Generics Java Basics - Anfänger-Themen 3
L Generics Tripel Java Basics - Anfänger-Themen 26
W Fragen zu Generics Java Basics - Anfänger-Themen 14
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
X Wie Generics richtig benutzen ? Java Basics - Anfänger-Themen 5
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
I Java Generics factory method Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
I Generics und Comparable Java Basics - Anfänger-Themen 14
G Generics mit ? und Diamantoperator Java Basics - Anfänger-Themen 4
G Generics: Wildcard ? Java Basics - Anfänger-Themen 12
D Generics methode Java Basics - Anfänger-Themen 2
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
W Generics - Typ zurückbekommen Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Generics von Profis leicht erklärt Java Basics - Anfänger-Themen 7
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
J Collections Generics: Typ wird nicht erkannt Java Basics - Anfänger-Themen 7
D Generics ArrayList: Bug im Quellcode Java Basics - Anfänger-Themen 14
C Generics Java Basics - Anfänger-Themen 8
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
T Generics in Java... Java Basics - Anfänger-Themen 9
J Generics Java Basics - Anfänger-Themen 3
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
O Generics - Implementierung Java Basics - Anfänger-Themen 7
Shizmo Frage zu Generics Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
H Typsicherheit/Generics Java Basics - Anfänger-Themen 1
U Java generics funktioniert nicht Java Basics - Anfänger-Themen 0
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Generics Java Basics - Anfänger-Themen 4
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
R Compiler-Fehler Generics Problem Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
K Generics bei Klassen- und Interfacedeklarationen Java Basics - Anfänger-Themen 3
D toArray und Generics Java Basics - Anfänger-Themen 2
D Zwei Generics beim Überladen von Methoden Java Basics - Anfänger-Themen 3
C Erste Schritte Filter für Generics oder ähnliches Java Basics - Anfänger-Themen 2
M Frage zu Generics-Deklaration Java Basics - Anfänger-Themen 5
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
J Java Generics - Frage zu Types Java Basics - Anfänger-Themen 2
M <T> Generics Java Basics - Anfänger-Themen 7
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
T Polymorphie Generics-Problem Java Basics - Anfänger-Themen 2
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
J Array Generics Java Basics - Anfänger-Themen 3
J Generics casten Java Basics - Anfänger-Themen 14
J Generics wildcard Java Basics - Anfänger-Themen 6
E Listen und Generics Java Basics - Anfänger-Themen 9
X Generics Java Basics - Anfänger-Themen 6
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
M OOP Mit Generics auf Methoden zugreifen? Java Basics - Anfänger-Themen 10
S Generics Java Basics - Anfänger-Themen 4
G Generics kein Zugriff auf getter eines Objekts Java Basics - Anfänger-Themen 4
L Datentypen Problem mit Generics und null Java Basics - Anfänger-Themen 6
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
W Interface Problem mit Generics Java Basics - Anfänger-Themen 2
M OOP Generics und Wildcards Java Basics - Anfänger-Themen 3
D Generics - Warnmeldungen Java Basics - Anfänger-Themen 2
M Polymorphie generics einsteigerprobleme Java Basics - Anfänger-Themen 3
D Vererbung Generics und Vererbung Java Basics - Anfänger-Themen 8
C Generics Array Java Basics - Anfänger-Themen 43
D Fehler mit generics Java Basics - Anfänger-Themen 10
S Generics - CaseInsensitiveMap selber schreiben? Java Basics - Anfänger-Themen 5
K Datentypen Generics Java Basics - Anfänger-Themen 3
P Comparable und Generics Java Basics - Anfänger-Themen 6
I Generics (Subtypen) Java Basics - Anfänger-Themen 17
N Typeinschränkung bei Generics Java Basics - Anfänger-Themen 13
C Generics und Cast Java Basics - Anfänger-Themen 5
H Generics werden in -source 1.2 nicht unterstützt Java Basics - Anfänger-Themen 16
M Datentypen Generics: Exacten Typ ermitteln Java Basics - Anfänger-Themen 6
N Generics und Interfaces Java Basics - Anfänger-Themen 5
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
lumo Java Generics Java Basics - Anfänger-Themen 19
M verlinkte Liste mit generics Java Basics - Anfänger-Themen 7
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
S Generics und Typerkennung Java Basics - Anfänger-Themen 7
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
B Java Listen und Generics Java Basics - Anfänger-Themen 35
O Abstract Method & Generics Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben