我正在尝试在 Java 中实现可扩展的偶数驱动架构。不幸的是,我不能让它完全安全。以下是我所做的。
首先我定义事件。这是一个几乎是空的类来扩展。
public abstract class Event {
public final Class<? extends Event> getEventType() {
return this.getClass();
}
}
和听众:
public interface Listener<T extends Event> {
Class<T> getEventType();
void onEvent(T event);
}
到现在为止还挺好。但是当我尝试实现事件调度程序时,我被卡住了。
public class EventDispatcher {
private Map<Class<? extends Event>, Collection<Listener>> listenersDict = new HashMap<>();
public void registerListener(Listener listener) {
Class<? extends Event> eventType = listener.getEventType();
Collection<Listener> listeners = listenersDict.get(eventType);
if(listeners == null) {
listeners = new ArrayList<>();
listenersDict.put(eventType, listeners);
}
listeners.add(listener);
}
public void dispatch(Event event) {
Class<? extend Event> eventType = event.getEventType();
Collection<Listener> listeners = listenersDict.get(eventType);
if(listeners != null) {
for(Listener listener : listeners) {
@SuppressWarnings("unchecked") // Necessary Evil?
listener.onEvent(event);
}
}
}
}
如您所见,我必须使用@SuppressWarnings
. 我尝试了所有我能想到的方法,但其中一种方法registerListener
总是dispatch
类型不安全的。(更改Listener
为Listener<Event>
或更改不起作用。我真的尝试过。Listener<? extends Event>
)EventDispatcher
是否可以实现具有相同灵活性的架构(可扩展的事件和侦听器,单个调度程序处理不同的侦听器),但没有不安全的代码?