Java泛型编译器错误:What';怎么了?
我目前正在尝试使用通用侦听器编程一个事件系统Java泛型编译器错误:What';怎么了?,java,generics,compiler-errors,Java,Generics,Compiler Errors,我目前正在尝试使用通用侦听器编程一个事件系统 应将所有侦听器添加到单个EventSource对象,该对象将为特定事件调用其receiveEvent()方法。 事件来源: 公共类事件源{ 私有HashMap问题是您正在迭代一个列表。非常感谢您的工作。但我仍然不明白为什么这不起作用。当我初始化ClassImagine 2Event子类、Event1和Event2类型的字段时,t理论上可能是de>Event1和?可能是Event2,在这种情况下,它们将不兼容。编译器与泛型的工作是确保类型安全,并且由于
应将所有侦听器添加到单个EventSource对象,该对象将为特定事件调用其receiveEvent()方法。
事件来源:
公共类事件源{
私有HashMap问题是您正在迭代一个列表。非常感谢您的工作。但我仍然不明白为什么这不起作用。当我初始化ClassImagine 2Event
子类、Event1
和Event2
类型的字段时,t
理论上可能是de>Event1
和?
可能是Event2
,在这种情况下,它们将不兼容。编译器与泛型的工作是确保类型安全,并且由于这种可能性,它必须禁止将可能不兼容的参数传递给方法。好的,我想我有点明白了。非常感谢!
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
}
}
}
public interface EventListener<T extends Event> {
public void receiveEvent(T 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.
}
}
}