Я реализовал нечто подобное, потому что у меня внутренняя неприязнь к EventListenerList Java. Сначала вы реализуете универсальный слушатель. Я определил слушателя на основе события, которое он получал, в основном одним методом
interface GenericListener<T extends Event> {
public void handle(T t);
}
Это избавляет вас от необходимости определять ListenerA, ListernerB и т. Д. ... Хотя вы можете сделать это по-своему с помощью ListenerA, ListenerB и т. Д., Расширяя некоторые основы, такие как MyListener. У обоих способов есть свои плюсы и минусы.
Затем я использовал CopyOnWriteArraySet
для удержания всех этих слушателей. Набор - это то, что нужно учитывать, потому что слишком часто слушатели добавляются дважды неаккуратными кодировщиками. YMMV. Но, по сути, у вас есть Collection<GenericListener<T extends Event>> or a Collection<MyListener>
Теперь, как вы обнаружили, при стирании типов коллекция может содержать только один тип слушателей. Это часто проблема. Решение: используйте карту.
Поскольку я основываю все на событии, я использовал
Map<Class<T extends Event>, Collection<GenericListener<T extends Event>>>
в зависимости от класса события, получите список слушателей, которые хотят получить это событие.
Ваша альтернатива - основывать его на классе слушателя
Map<Class<T extends MyListener>, Collection<MyListener>>
Вероятно, есть некоторые опечатки выше ...