Я написал пользовательскую систему обработки событий / событий, которая обычно выглядит следующим образом:
Интерфейс обработчика событий:
public interface EventHandler{
}
Базовый класс событий:
public abstract class Event<H extends EventHandler> {
public static Class Type<H> { }
public abstract void dispatch(H handler);
}
Менеджер обработчиков:
public class HandlerManager {
private Map<Event.Type, List<EventHandler>> map = new HashMap<Event.Type, List<EventHandler>>();
public void register(Event.Type<H> type, H handler) {
if(map.get(type) == null) { map.put(type, new ArrayList<EventHandler>()); }
map.get(type).add(handler);
}
public void fire(Event<H> event) {...}
...
}
И все работает нормально, но я хочу использовать такие события, как
public class DataChangeEvent<D> extends Event<DataChangeHandler<D>> {
public static final Type<?> TYPE = new Type<?>();
D data;
...
public void dispatch(DataChangeHandler<D> handler) {
handler.onDataChanged(this);
}
public D getData() { return data; }
}
public class DataChangeHandler<D> extends EventHandler {
void onDataChanged(DataChangeEvent<D> event);
}
, и теперь, когда я регистрирую обработчик DataChangeHandler с менеджером, который генерирует события для строк и, например,для целых чисел этот зарегистрированный обработчик получит оба события, которые вызывают ClassCastException, когда я хочу прочитать данные.Я понимаю, что у дженериков нет специального класса и что, несмотря на тип, определенный в DataChangeHandler, они хранятся в одном и том же списке на карте обработчиков.
Есть ли способ заставить его работать?