Methode für generische enummap/enum

dermoritz

Bekanntes Mitglied
Ich kriege es irgendwie nicht hin eine Methode zu basteln die eine EnumMap ausgibt und ein enum als Parameter hat. Der Parameter gibt sozusagen den Typ des zurückgegeben enums vor.

Der Kopf der Methode sieht so aus:
Java:
private EnumMap<?, String> tuWas(Enum<?> enumI, String zeile)
als erstes müsste ich den Typ des gegebenen Enums rauskriegen, aber daran scheitere ich (enumI.class funzt nicht). Geht das irgendwie?
 

dermoritz

Bekanntes Mitglied
Danke das hat schonmal etwas geholfen :). nur kann ich jetzt nicht über die werte (values()) von enumI iterieren?! Ich glaube enumI ist eine Enum-Konstante und nicht der Enumtyp. Den ich hab so Methoden wie "name" und "ordinal". Also die Methode soll genrisch auf einer "EnumKlasse" operieren.

Andererseits fällt mir gerade ein, das es etwas zu generisch ist. Letztendlich habe ich einige lokale (String)enums mit denen die Methode funktionieren soll. All diese Enums haben eine Funktion, welche den Stringwert zurückgibt. Damit könnte ich ein Interface basteln und die angesprochene Methode würde so aussehen:
Java:
private EnumMap<StringEnum, String> tuWas(StringEnum enumI, String zeile)
Das funktioniert aber leider nicht, denn eine EnumMap kann nicht mit einem Interface gebastelt werden. Das Interface sieht so aus:
Java:
	public interface StringEnum {
		public String getString();
	}
Also gibt es irgendeine Variante eine Methode generisch für verschiedene Enum-Klassen(die ein Interface implementieren) zu basteln und eine EnumMAp zurückgibt?
 

Der Müde Joe

Top Contributor
Nein.

Eine Enum ist nichts anderes als eine Klasse, welche:
- von Enum erbt

Code:
The direct superclass of an enum type named E is Enum<E>.

- final ist

Code:
An enum type is implicitly final unless it contains at least one enum constant
Code:
 that has a class body. In any case, it is a compile-time error
Code:
to explicitly declare an enum type to be final.

und noch anderes Tolles hat...

Classes

EDIT:
Und ne EnumMap will halt genau die <K extends Enum<K>> und nicht was anderes ;-)
 
Zuletzt bearbeitet:
S

SlaterB

Gast
siehe noch folgendes Beispiel:

Java:
public class Test {
    public static void main(String[] args)  {
        Map map = null;
        map = tuWas(A.class);
        map = tuWas(B.class);
    }

    private static <T extends StringEnum>Map<T, String> tuWas(Class<T> eClass)  {
        Map<T, String> map = new HashMap<T, String>();
        for (T t : eClass.getEnumConstants())  {
            map.put(t, "mapper " + t.getString());
        }
        return map;
    }
}

interface StringEnum {
    public String getString();
}

enum A     implements StringEnum {
    B, C;
    public String getString()   {
        return "hello " + name();
    }
}

class B  implements StringEnum {
    public String getString()
    {
        return "hello ";
    }
}
leider lässt sich soweit ich es auf die Schnelle überblicke, nicht verhindern, dass auch normale Klasse,
die das Interface implementieren, von der Methode angenommen werden

edit:
> private static <T extends Enum<T> & StringEnum>
hilft anscheinend
 
Zuletzt bearbeitet von einem Moderator:

dermoritz

Bekanntes Mitglied
gibt es irgendeine andere Möglichkeit vielleicht ohne Interface? Oder muss ich die Methode für jeden Enum-Typ implementieren? Was ich eben auch nicht verstehe ist, warum in deiner vorgeschlagenen Lösung nicht "enumI.class.getEnumConstants()" nicht funktioniert?! Mit "normalen" enums geht das ja.

Edit: slater ich hab dein Beitrag zu spät entdeckt. Eigentlich wollte ich eben gerne mit EnumMap arbeiten - das soll besonders effizient sein. Aber am wichtigsten wäre mir, dass ich weiß das die Schlüssel enums sind.

Edit2: Slater dein Konstrukt funktioniert (nix mehr rot) - danke. Nun wäre noch die Frage ob ich jemals wieder von T zu einem Enum komme - bzw irgendwann hätte ich gerne eine (Enum)Map bei der ich mit EnumSchlüsseln an die Werte komme?!
 
Zuletzt bearbeitet:
S

SlaterB

Gast
EnumMap habe ich in meinem Beispiel nicht geschrieben, weil ich das nicht kenne,
kannst du machen wie du willst,

ich habe von deinem Satz
> gibt es irgendeine Variante eine Methode generisch für verschiedene Enum-Klassen(die ein Interface implementieren) zu basteln und eine EnumMAp zurückgibt?
nur
> gibt es irgendeine Variante eine Methode generisch für verschiedene Enum-Klassen(die ein Interface implementieren) zu basteln?
beantwortet ;)

----

und wer sagt, dass enumI.class.getEnumConstants() nicht geht?
bzw es muss enumI.getClass().getEnumConstants() lauten

wobei du besser wie in meinem Beispiel die Class an sich übergeben solltest stats speziell einen Enum-Wert davon,
bei Übernahme null sähe es düster aus (edit: ok, ist bei class == null genauso)
 
Zuletzt bearbeitet von einem Moderator:

Der Müde Joe

Top Contributor
suchst du sowas?
blick grad net ganz durch (muss nochmals genau lesen)
Java:
private <T extends Enum<T> & SomeIF> EnumMap<T, String> tuWas(Class<T> clazz, String zeile) {
    if(clazz != null) {
        T[] t = clazz.getEnumConstants();
        EnumMap<T, String> result = new EnumMap<T, String>(clazz);
        //do some stuff
        result.put(t[0], t[0].name());
        return result;
    }
    throw new IllegalArgumentException("peng");
}

interface SomeIF{}

EDIT:
oh...des hat ja SlaterB schon geschrieben
 

dermoritz

Bekanntes Mitglied
lange Rede kurzer Sinn, ich glaube Ihr habt mich "gerettet" :) Müder Jow danke für "<T extends Enum<T>>", Slater danke für "Class<T>" damit geht es wie folgt:

Java:
	private  <T extends Enum<T>> EnumMap<T, String> tuWas(Class<T> enumI, String zeile){
		EnumMap<T, String> out = new EnumMap<T, String>(enumI);
		for(T t : enumI.getEnumConstants()){
			StringEnum blub = (StringEnum)t;
			out.put(t, "");
		}
		return null;
		
		
	}
Falls es jemand interessiert: ich bin gerade dabei einen "Parser" für ein spezielles Textformat zu schreiben. Dieses Textformat hat verschiedene "Sorten" von Zeilen - je nach Sorte erwartet man andere "Tags" (z.B. [Date]). Für jede Sorte Zeile hab ich ein Enum dieser speichert zum Beispiel Datum("[Date]"). so sieht so ein enum ca aus:
Java:
public enum KopfZeileTags implements StringEnum{
		Date("[Date]"),
                private String tag;
		private KopfZeileTags(String tag) {
			this.tag = tag;
		}
		public String getTag() {
			return tag;
		}
	}
Der Parser geht nun Zeilenweise durch die Datei und entscheidet welche Sorte Zeile es ist. Diese Zeile kann nun immer ein und der selben Methode gegeben werden - eben die um die es hier geht. Das praktische ist so können problemlos zusätzliche Zeilensorten hinzukommen aber auch zusätzliche Tags innerhalb der Zeilen. Und am Code muss man kaum was ändern.

EDIT: das sowas geht "<T extends Enum<T> & StringEnum>" wusst ich gar nicht - genial. damit kann ich mir den cast sparen :)
 
Zuletzt bearbeitet:

Der Müde Joe

Top Contributor
Den
Code:
 StringEnum blub = (StringEnum)t;
kriegst du durch:
Code:
<T extends Enum<T> & StringEnum>
raus.
Dann geht auch automatisch ein getTag ;-)

EDIT:
hehe...selbst erkannt... :toll:
 
S

SlaterB

Gast
wie wir beide inzwischen geschrieben haben:
verwende <T extends Enum<T> & StringEnum>
dann musst du nicht mehr casten und es können keine falschen Enums übergeben werden

edit: Hattrick
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
H FTP Befehl/Java Methode für Submit im z/Os (Host) Allgemeine Java-Themen 1
C Methode für tiefe Kopie eines unbekannt (dimensionierten & typisierten) Feldes realisierbar? Allgemeine Java-Themen 7
Meldanor finalize Methode überschreiben für .close() Allgemeine Java-Themen 5
H Generics für Methode Allgemeine Java-Themen 14
Screen Eine mathematische Funktion als Argument für eine Methode - Matheparser? Allgemeine Java-Themen 21
L Checkstyle: Wann ist eine Methode für Vererbung entworfen? Allgemeine Java-Themen 13
H GUI: RectangleDrawer - zu viele Elemente im Vector für die paint-Methode Allgemeine Java-Themen 6
L Methode "Neues Spiel" für Memory Allgemeine Java-Themen 2
V 1 Methode für viele verschiedene Klassen? Allgemeine Java-Themen 9
E Existiert eine Methode für die Kalenderwochen im Jahr? Allgemeine Java-Themen 4
R keine sqrt methode für bigintegers? Allgemeine Java-Themen 14
0 Keine clone-Methode für BigDecimal und BigInteger? Allgemeine Java-Themen 3
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Sinn einer toString Methode Allgemeine Java-Themen 3
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L ToString-Methode Allgemeine Java-Themen 6
X Datentypen NPE in längerer Methode Allgemeine Java-Themen 12
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
R Rekursive Methode Allgemeine Java-Themen 8
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
R rekursive und iterative Methode Allgemeine Java-Themen 3
P Methoden Anwendung der allMatch()-Methode Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
D Methoden Methode zum Steinschnitt Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
snipesss Methode greift nicht auf JTextPanel zu Allgemeine Java-Themen 3
R Methode in Methode voraussetzen Allgemeine Java-Themen 8
S Überschriebene Methode der Oberklasse der Oberklasse aufrufen. Allgemeine Java-Themen 5
D Methode dynamisch aufrufen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
KaffeeFan Methoden Suche Methode um Programm kurz warten zu lassen Allgemeine Java-Themen 22
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
BRoll Methode abbrechen (Invoke von außen) Allgemeine Java-Themen 5
I Methode verallgemeinern (Methode als Parameter)? Allgemeine Java-Themen 10
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
G Threads Methode nebenbei ausführen, Status verarbeiten Allgemeine Java-Themen 4
M Fabrik Methode, gutes Beispiel? Allgemeine Java-Themen 0
M WebService - Zugriff auf Webservice Methode über Browser Allgemeine Java-Themen 1
N WaitForScript- methode in javafx Allgemeine Java-Themen 1
2 jede Stunde Methode ausführen Allgemeine Java-Themen 8
M Eine static-Methode verlassen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben