【发布时间】:2015-01-07 19:47:07
【问题描述】:
我需要使用每个事件类的侦听器列表来实现观察者模式。
我有:
空界面事件
public interface Event {}
监听器接口:
public interface EventListener<T extends Event> {
void handle(T event);
Class<T> getEventClass();}
和事件来源:
public class EventSource {
private final Map<Class<? extends Event>, List<EventListener<? extends Event>>> listeners = new HashMap<>();
public <T> void subscribe(EventListener<? extends Event> listener) {
Class<? extends Event> eventClass = listener.getEventClass();
if (!listeners.containsKey(eventClass)) {
listeners.put(eventClass, new ArrayList<>());
}
listeners.get(eventClass).add(listener);
}
public void unsubscribe(EventListener listener) {
listeners.remove(listener.getEventClass());
}
public void fire(Event event) {
for (EventListener listener : listeners.get(event.getClass())) {
listener.handle(event); //<-- Unchecked call to 'handle(T)' as a member of raw type...
}
}}
它有效,但我有“未经检查的呼叫”警告。如何避免?
我试过了:
public void fire(Event event) {
for (EventListener<? extends Event> listener : listeners.get(event.getClass())) {
listener.handle(event);//<-- compilation error
}
}
但在这种情况下,我有“句柄不能应用于...”编译错误。
提前致谢!
【问题讨论】:
-
使用 NetBeans 7.4 我没有收到您的错误,但我收到了:
incompatible types: ArrayList<Object> cannot be converted to List<EventListener<? extends Event>>在您的listeners.put(eventClass, new ArrayList<>());下 -
感谢您的建议。我明白这个问题。在地图,列表
>> 编译器不知道“?”在课堂和“?” List 中的类型相同。而且我看不出如何告诉编译器。
标签: java generics observer-pattern unchecked