Einfaches Eventhandling führt zu Brett vor Kopf

temi

Top Contributor
Ich komm hier nicht mehr weiter, vielleicht geht das auch gar nicht, was ich möchte. Vielleicht hat ja einer von euch die richtige Lösung.

Ich versuche mir ein einfaches Eventhandling zu programmieren. FxEvent ist ein einfaches Markerinterface für einen Eventtyp
Java:
public class FxEvents implements FxEventBus {

    private final Map<Class<? extends FxEvent>, List<Consumer<FxEvent>>> listeners = new HashMap<>();

    @Override
    public void publish(FxEvent event) {
        Class<? extends FxEvent> eventClass = event.getClass();
        var eventListeners = listeners.get(eventClass);
        for(var listener : eventListeners) {
            listener.accept(event);
        }
    }

    @Override
    public <T extends FxEvent> void register(final Class<T> eventClass, final Consumer<FxEvent> listener) {
        if (!listeners.containsKey(eventClass)) {
            listeners.put(eventClass, new LinkedList<>());
        }

        listeners.get(eventClass).add(listener);
    }
}

// Ein Event-Dummy
public class BlubEvent implements FxEvent { }

// und eine Listener-Methode

public void handleBlub(BlubEvent blub) { }

// und die Registrierung, die leider fehlschlägt
eventBus.register(BlubEvent.class, this::handleBlub); // <== Incompatible types: FxEvent is not convertible to BlubEvent

Ein Versuch, dass Problem zu beheben:
Java:
public <T extends FxEvent> void register(final Class<T> eventClass, final Consumer<T> listener) { // <== Consumer<T> mit <T extends FxEvent>
    if (!listeners.containsKey(eventClass)) {
        listeners.put(eventClass, new LinkedList<>());
    }

    listeners.get(eventClass).add(listener); // <== listener kann nicht mehr hinzugefügt werden: required Type: FxEvent
}
Zusätzlich noch:
Java:
private final Map<Class<? extends FxEvent>, List<Consumer<? extends FxEvent>>> listeners = new HashMap<>(); // <== List<Consumer<? extends FxEvent>>>

// damit funktioniert das Hinzufügen, aber jetzt kommt der Fehler hier:
for(var listener : eventListeners) {
    listener.accept(event); // <== Required type: capture of ? extends FxEvent, Provided: FxEvent
}

Hat jemand einen Tipp für mich?
 

LimDul

Top Contributor
Im Zweifelsfall casten. Ich hab gerade nicht die Zeit & Nerven mich da intensiver mit zu beschäftigen, Generics mit extends sind manchmal etwas zickig.

Dein erster Versuch sieht auf jeden Fall gut aus. Wichtig ist, dass das Interface nach außen sauber ist und keinen Unfug erlaubt. Daher ist

Java:
public <T extends FxEvent> void register(final Class<T> eventClass, final Consumer<T> listener)
das besser als das:

Java:
    public <T extends FxEvent> void register(final Class<T> eventClass, final Consumer<FxEvent> listener)
Weil so erhält der Consumer direkt das Event vom richtigen Typ und muss nicht mehr selber casten.

Intern kannst du in deiner Klasse einfach auf die richtigen Typen casten. Generics existieren ja eh nur zur Laufzeit. Das heißt, du kannst den Listener einfach auf den erwarteten Typ casten.

Es gibt evtl. auch eine sauberere Lösung, aber da fehlt mir gerade die Zeit für.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Einfaches Beispiel mit Netty Socket.IO Allgemeine Java-Themen 6
S Einfaches Programm programmieren Allgemeine Java-Themen 5
K Einfaches Array in 2 neue aufteilen. Allgemeine Java-Themen 2
A Lotto, einfaches Problem? Allgemeine Java-Themen 11
E einfaches Beispiel zu MVC und Sinn V --> M ? Allgemeine Java-Themen 22
M einfaches Lagerverwaltungsapp Allgemeine Java-Themen 4
Gossi Threads Suche ein (einfaches) Beispiel Allgemeine Java-Themen 5
E Beispiel für ein möglichst einfaches Interface Allgemeine Java-Themen 22
V Ganz einfaches MVC-Beispiel?! Allgemeine Java-Themen 107
E Einfaches Problem mit Tomcat Allgemeine Java-Themen 18
D Einfaches Nutzen von Plugins mittels generischer Methode Allgemeine Java-Themen 3
W Einfaches Installer/setup tool für java programme das. Allgemeine Java-Themen 4
E (einfaches) Problem mit import und package (export) Allgemeine Java-Themen 4
J Einfaches AspectJ Beispiel Allgemeine Java-Themen 2
reibi javax.crypto.SecretKey - Einfaches Beispiel gewünscht ;-) Allgemeine Java-Themen 2
T Einfaches Java Programm PHP5-fähig machen Allgemeine Java-Themen 19
V Suche einfaches JasperReports Tutorial Allgemeine Java-Themen 23
raptorrs Klassenübergreifendes Eventhandling, wie gestalten? Allgemeine Java-Themen 2
G Models EventHandling Allgemeine Java-Themen 14
X Ereignisbehandlung, Eventhandling Allgemeine Java-Themen 3
R Programm führt Methoden gleichzeitig aus Allgemeine Java-Themen 2
L Liste führt sich nicht weiter Allgemeine Java-Themen 5
M Methoden Methode führt Ende vor dem Anfang aus Allgemeine Java-Themen 7
B JAR Datei führt eine andere JAR Datei aus Allgemeine Java-Themen 2
R Öffnen eines COM-Ports führt zu Programmabsturz Allgemeine Java-Themen 6
R Was führt dieser Code aus Allgemeine Java-Themen 3
S Kopieren von Datei führt zu Beschädigung Allgemeine Java-Themen 7
G Swing Timer führt Methode nicht aus Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben