Java泛型编译器错误:出了什么问题?

时间:2014-04-09 18:13:28

标签: java generics compiler-errors

我目前正在尝试使用通用监听器对事件系统进行编程。
应将所有侦听器添加到单个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);
}

有人可以解释我做错了吗?

1 个答案:

答案 0 :(得分:1)

问题是你在List<EventListener<? extends Event>>上进行迭代,但编译器并不知道哪个类EventEvent的子类,{ {1}}通配符可能是。 ?类型参数也可以是TEvent的任何子类。由于这个原因,他们不匹配。

尝试删除通配符:

Event