Ich brauche eine ENUM ENUM-Konverter in Java zu implementieren: Enum_2
>Enum_1
und ich möchte es in allgemeiner Weise zu tun.Warum muss dieser Konverter gegossen werden?
So definiert ich eine Schnittstelle:
interface LabelAware<T extends Enum> {
String getLabel();
T getObject();
}
und Enum_1
:
enum Enum_1 {
A, B;
String getValue() {
return "whatever";
}
}
und Enum_2
die LabelAware
implementiert und muss Enum_1
umgewandelt werden:
enum Enum_2 implements LabelAware<Enum_1> {
C("c", Enum_1.A), D("d", Enum_1.B);
private final String label;
private final Enum_1 object;
Enum_2(String label, Enum_1 object) {
this.label = label;
this.object = object;
}
public String getLabel() {
return label;
}
public Enum_1 getObject() {
return object;
}
}
Schließlich ist hier ein generischer Konverter (List.ofAll()
kommt von javaslang):
class Converter<S extends LabelAware, D extends Enum> {
private S[] values;
Converter(S[] values) {
this.values = values;
}
D map(String label) {
return (D) List.of(values)
.find(v -> v.getLabel().equals(label))
.map(LabelAware::getObject)
.getOrElseThrow(() -> new RuntimeException(""));
}
}
Und eine Hauptmethode:
public class Main {
public static void main(String[] args) {
System.out.println(new Converter<Enum_2, Enum_1>(Enum_2.values()).map("c").getValue());
}
}
es alles kompiliert und läuft gut, aber ich habe keine Ahnung, warum ich brauche das Ergebnis Converter.map
Verfahren zu gieße D
, da ich D
Enum
zu verlängern erklärt haben. Kann es generisch ohne Warnungen gemacht werden?
Ist 'List.of (Werte)' vom Typ 'S' nicht? –
Ich bin auf meinem Handy, so dass es schwer zu lesen ist, aber beachten Sie, dass Enum eine generische Klasse ist, so dass Ihre Generika einen rohen Typ wie geschrieben enthalten. In der Regel werden Sie wollen,> '. Nicht sicher, ob das dein Problem ist. –
yshavit
@yshavit, es ändert nichts - ungeprüfte Warnung ist immer noch vorhanden. – Opal