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
Ein Versuch, dass Problem zu beheben:
Zusätzlich noch:
Hat jemand einen Tipp für mich?
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
}
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?