Один из вариантов - написать собственный класс производителя событий.
- IEventListener
- IEventProducer , EVENT>
- EventProducer , EVENT> реализует IEventProducer
IEventListener реализован наблюдателями. У него есть метод для получения события.
IEventProducer реализуется любым наблюдаемым через EventProducer. У него есть методы для добавления и удаления слушателей.
EventProducer является поточно-ориентированным. У него есть метод для отправки событий в CopyOnWriteArrayList слушателей. Он ловит и регистрирует любые исключения, выдаваемые слушателями. Он также предоставляет методы для добавления и удаления слушателей.
Тогда любой наблюдаемый класс может реализовать IEventProducer через внутренний EventProducer.
Если вы пытаетесь поддерживать два типа слушателей в одном и том же классе, стирание типов потребует, чтобы вы называли методы добавления / удаления слушателей по-разному для разных слушателей.