我目前正在尝试使用通用监听器来编写事件系统。
所有监听器都应添加到单个 EventSource 对象,该对象将为特定事件调用其 receiveEvent() 方法。
事件源:
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
}
}
}
产生的错误是:
The method receiveEvent(capture#2-of ? extends Event) in the type EventListener is not applicable for the arguments (T)
EventListener 只是:
public interface EventListener<T extends Event> {
public void receiveEvent(T event);
}
有人可以解释一下我做错了什么吗?
最佳答案
问题是您正在迭代 List<EventListener<? extends Event>>
,但编译器不知道是哪个类,Event
或 Event
的子类,?
通配符可以是。 T
类型参数也可以是 Event
或 Event
的任何子类。由于这个原因它们不匹配。
尝试删除通配符:
// Removed wildcard
private HashMap<String, List<EventListener<Event>>> events = new HashMap<>();
public synchronized <T extends Event> void fireEvent(T event){
String key = event.getClass().getName();
if(events.containsKey(key)){
// Removed wildcard.
Iterator<EventListener<Event>> i = events.get(key).iterator();
while(i.hasNext()){
i.next().receiveEvent(event); // This compiles now.
}
}
}
关于Java泛型编译器错误: What's wrong?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22970696/