我正在为参数化事件编写一个简单的事件系统,该系统使用从类到以该类为参数的处理程序的Map
的Set
。我的理解是I can't define that relationship between key and value types via parameter restrictions,并且我得到了未经检查的强制警告,将元素从集合中拉出。
这是我目前所拥有的:
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);
}
}
是否可以避免这种未经检查的演员?我的设计中可能有缺陷吗?
我已经在这里和Google上度过了很长时间,但找不到任何涵盖此安排的内容。
最佳答案
如果事件类本身形成层次结构,则可以通过使用Visitor模式来避免强制转换。在Java中这非常麻烦,但是没有强制转换的必要。