Нужна помощь с использованием Java Generics

Я пытаюсь создать систему для реагирования на события, происходящие в моем приложении, похожую на шаблон 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 при запуске - время.

Как я могу решить эти проблемы?

5
задан Austin Hyde 20 October 2011 в 16:59
поделиться