我正在为参数化事件编写一个简单的事件系统,它使用Map
从类到以Set
该类作为参数的处理程序。我的理解是,我无法通过参数限制来定义键和值类型之间的关系,并且我会收到未经检查的强制转换警告,将元素从集合中拉出。
这是我目前拥有的:
public class Manager {
private class Event<T> {
// getSubject(), etc.
}
private interface Handler<T> {
public T handleEvent(Event<T> event, T subject);
}
private final Map<Class<?>, Set<Handler<?>>> handlers = new HashMap<Class<?>, Set<Handler<?>>>();
public <T> void post(final Event<T> event, final T subject) {
final Class<?> type = subject.getClass();
if (this.handlers.containsKey(type)) {
for (Handler<?> handler : this.handlers.get(type)) {
// unchecked cast
((Handler<T>) handler).handleEvent(event, subject);
}
}
}
public <T> void register(final Class<T> type, final Handler<T> handler) {
if (!this.handlers.containsKey(type)) {
this.handlers.put(type, new HashSet<Handler<?>>());
}
this.handlers.get(type).add(handler);
}
}
是否可以避免这种未经检查的演员表?我的设计可能有缺陷吗?
我在这里和谷歌上花了相当长的时间,但无法找到完全涵盖这种安排的任何内容。