Java泛型编译器错误: What's wrong?

标签 java generics compiler-errors

我目前正在尝试使用通用监听器来编写事件系统。
所有监听器都应添加到单个 EventSource 对象,该对象将为特定事件调用其 receiveEvent() 方法。

事件源:

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 method receiveEvent(capture#2-of ? extends Event) in the type EventListener is not applicable for the arguments (T)

EventListener 只是:

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

有人可以解释一下我做错了什么吗?

最佳答案

问题是您正在迭代 List<EventListener<? extends Event>> ,但编译器不知道是哪个类,EventEvent 的子类,?通配符可以是。 T类型参数也可以是 EventEvent 的任何子类。由于这个原因它们不匹配。

尝试删除通配符:

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

关于Java泛型编译器错误: What's wrong?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22970696/

相关文章:

java - 混合方法引用和泛型时出现 LambdaConversionException

java - Firebase SDK Admin setCredentials 除了静态 JSON 文件

java - 两个不同的对象打印相同的属性值

java - 父模块中的 Gradle 依赖平台

c - 无法在 Ubuntu 13 上编译 avr-libc 源

php - php中ini_set()的目的是什么? (尤其是错误报告)

c++ - 无法实例化简单的类

java - 在 Eclipse 中查找重写方法的实例

c# - 为什么这个通用列表没有保存在应用程序设置中?

java - Lambda 表达式和泛型仅在方法中定义