Ich möchte einen bestimmten Setter in einem generischen Code aufrufen. Natürlich kann ich auf eine Fallaussage zurückgreifen, aber sie wird immer größer, deshalb bevorzuge ich eine Karte.So verwenden Sie eine Map zum Aufrufen einer Aktion für ein Objekt
Dies ist, was ich mit so weit kam:
public class Tester {
private static final Map<String, Setter<Target, ?>> MY_SETTERS = new HashMap<>();
static {
MY_SETTERS.put("SOURCE1", (Target t, Source1 s) -> t.setSource1(s));
MY_SETTERS.put("SOURCE2", (Target t, Source2 s) -> t.setSource2(s));
}
@FunctionalInterface
private interface Setter<T, S> {
void set(T target, S source);
}
public static void main(String[] args) {
Target t = new Target();
MY_SETTERS.get("SOURCE1").set(t, new Source1());
}}
aber das gibt mir ein „inkompatible Typen: Source1 nicht konvertiert werden kann # 1 wo CAP # 1 ist ein frischer Typ-Variable zu CAP : CAP # 1 erweitert Objekt von Capture von? "
Ich verstehe, warum es scheitert. Gibt es jedoch eine elegante Möglichkeit, dies zu tun, ohne auf eine Fallaussage zurückzugreifen?
Ist es nicht in Frage, nur explizite Getter schreiben für jeden 'Setter'? Sie würden also einfach mit 'MY_SETTERS.getSource1Setter() festhalten. Set (t, new Source1());'. Natürlich hat dies den Nachteil, dass Sie genau wissen müssen, mit welchem Setter Sie jedes Mal zu tun haben. –
Obicere
@Obicere .. Das Problem ist, dass mein Real Casus eine große JAXB generierte Choice-Klasse mit ziemlich vielen Einträgen ist. Ich möchte sie generisch behandeln, da der Rest der Verarbeitungsschritte derselbe ist. – sjaak