[英]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.