簡體   English   中英

Java泛型編譯器錯誤:怎么了?

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

我目前正在嘗試使用通用偵聽器對事件系統進行編程。
所有偵聽器都應添加到單個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(capture#2-of?extended Event)不適用於參數(T)

EventListener僅是:

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

有人可以解釋我在做什么錯嗎?

問題是您要遍歷List<EventListener<? extends 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.
     }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM