Я пытаюсь создать систему для реагирования на события, происходящие в моем приложении, похожую на шаблон Observer. В моей системе триггерные события EventProducer
и EventConsumer
отвечают на эти события, и они оба связаны через центральный концентратор:
На данный момент я собираюсь игнорируйте EventProducer
и сосредоточьтесь на EventHub
и EventConsumer
:
interface EventConsumer<E extends Event> {
void respondToEvent(E event);
}
class EventHub {
private HashMap<Class</*event type*/>, HashSet<EventConsumer</*event type*/>>> subscriptions;
public <E extends Event> void fireEvent(E event) {
/* For every consumer in the set corresponding to the event type {
consumer.respondToEvent(event);
} */
}
public <E extends Event> void subscribeToEvent(EventConsumer<E> consumer) {
/* Insert consumer into the set corresponding to E */
}
}
Проблема заключается в объявлении HashMap
: I хочу, чтобы имел возможность делать что-то вроде
HashMap<Class<E extends Event>, HashSet<EventConsumer<E>>>
// or
<E extends Event> HashMap<Class<E>, HashSet<EventConsumer<E>>>
, чтобы EventConsumer
параметризовался тем же типом, что и Class
, но ближайший, который я могу найти, это
HashMap<Class<? extends Event>, HashSet<EventConsumer<? extends Event>>>
Но тогда это позволит назначить HashSet
классу
, при условии, что оба KeyPressEvent
и MouseClickEvent
подкласс Событие
.
Вторая проблема - в subscribeToEvent
: мне нужно сохранить потребителя в правильном наборе, соответствующем его событию, как в
subscriptions.get(E.class).put(consumer)
, но я не могу получить класс E при запуске - время.
Как я могу решить эти проблемы?