简体   繁体   English

Java泛型编译器错误:怎么了?

[英]Java Generics Compiler Error: What's wrong?

I am currently trying to program an event system using generic Listeners. 我目前正在尝试使用通用侦听器对事件系统进行编程。
All listeners should be added to a single EventSource Object which will call their receiveEvent() methods for a specific event. 所有侦听器都应添加到单个EventSource对象,该对象将针对特定事件调用其receiveEvent()方法。

EventSource : 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
        }
    }
}

The resulting error is: 产生的错误是:

The method receiveEvent(capture#2-of ? extends Event) in the type EventListener is not applicable for the arguments (T) 类型EventListener的方法receiveEvent(capture#2-of?extended Event)不适用于参数(T)

EventListener is only: EventListener仅是:

public interface EventListener<T extends Event> {
    public void receiveEvent(T event);
}

Could someone explain what I am doing wrong, please? 有人可以解释我在做什么错吗?

The problem is that you're iterating over a List<EventListener<? extends Event>> 问题是您要遍历List<EventListener<? extends Event>> List<EventListener<? extends Event>> , but the compiler doesn't know which class, Event or a subclass of Event , the ? List<EventListener<? extends Event>> ,但是编译器不知道哪个类, Event或子类Event中, ? wildcard could be. 通配符可以。 The T type parameter could also be Event or any subclass of Event . T类型参数也可以是Event或任何子Event They do not match for this reason. 由于这个原因,它们不匹配。

Try removing the wildcards: 尝试删除通配符:

// 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.
     }
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM