我正在为参数化事件编写一个简单的事件系统,该系统使用从类到以该类为参数的处理程序的MapSet。我的理解是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中这非常麻烦,但是没有强制转换的必要。

09-26 08:39