我目前正在尝试使用通用监听器对事件系统进行编程。
应将所有侦听器添加到单个EventSource对象中,该对象将为特定事件调用其receiveEvent()方法。
的EventSource :
public class EventSource {
private HashMap<String, List<EventListener<? extends Event>>> events = new HashMap<>();
public synchronized <T extends Event> void fireEvent(T event){
String key = event.getClass().getName();
if(events.containsKey(key)){
Iterator<EventListener<? extends Event>> i = events.get(key).iterator();
while(i.hasNext()){
i.next().receiveEvent(event); //Compiler Error
}
}
}
产生的错误是:
EventListener类型中的receiveEvent方法(捕获#2-of?extends Event)不适用于参数(T)
EventListener 仅限:
public interface EventListener<T extends Event> {
public void receiveEvent(T event);
}
有人可以解释我做错了吗?
答案 0 :(得分:1)
问题是你在List<EventListener<? extends Event>>
上进行迭代,但编译器并不知道哪个类Event
或Event
的子类,{ {1}}通配符可能是。 ?
类型参数也可以是T
或Event
的任何子类。由于这个原因,他们不匹配。
尝试删除通配符:
Event