Java 泛型 : Method X is not applicable for the arguments

标签 java

EventHandler.java:

public abstract class EventHandler<E extends EventArgs> { 
    public abstract void HandleEvent(Object sender, E e);
}

观察者.java:

public class Observers<E extends EventArgs> {

    private CopyOnWriteArrayList<EventHandler<? extends E>> mListeners = new CopyOnWriteArrayList<EventHandler<? extends E>>();

    public void dispatchEvent(Object sender, E args) {
        if (mListeners != null) {
            for (EventHandler<? extends E> listener : mListeners) {
                listener.HandleEvent(sender, args);
            }
        }
    }
}

下面一行:

listener.HandleEvent(sender, args);

原因:

The method HandleEvent(Object, capture#3-of ? extends E) in the type EventHandler is not applicable for the arguments (Object, E)

有人知道如何解决这个问题吗?

编辑1 原因? super E 对我不起作用是因为我在 Observers 类中有以下方法:

public void addListener(EventHandler<? super E> listener) {
mListeners.add(listener);
}

这会导致:

The method add(EventHandler) in the type CopyOnWriteArrayList> is not applicable for the arguments (EventHandler)

EDIT2

改变的原因? super EE 对我不起作用,因为: X is not applicable for the arguments Y, when X extends Y

它已经是那样了,但那也不起作用:(

最佳答案

为什么要将 mListeners 声明为 ~ ?扩展 E 而不仅仅是 E

如果你使用

private CopyOnWriteArrayList<EventHandler<E>> mListeners = new CopyOnWriteArrayList<EventHandler<E>>();

它会起作用。

或者采用PECS(Producer Extends,Consumer Super)。正如其他人所建议的那样

private CopyOnWriteArrayList<EventHandler<? super E>> mListeners = new CopyOnWriteArrayList<EventHandler<? super E>>();

for 循环进行了相关更改。

编辑:一个更完整的例子。这不会显示任何警告或错误,并且根据您提供的内容,它会起作用。

public static class Sandbox {
    public static interface EventArgs {}
    public static abstract class EventHandler<E extends EventArgs> { 
        public abstract void HandleEvent(Object sender, E e);
    }
    public static class Observers<E extends EventArgs> {

        private CopyOnWriteArrayList<EventHandler<? super E>> mListeners
                = new CopyOnWriteArrayList<EventHandler<? super E>>();

        public void dispatchEvent(Object sender, E args) {
            if (mListeners != null) {
                for (EventHandler<? super E> listener : mListeners) {
                    listener.HandleEvent(sender, args);
                }
            }
        }
        public void addListener(EventHandler<? super E> listener) {
            mListeners.add(listener);
        }        
    }
}

关于Java 泛型 : Method X is not applicable for the arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8136782/

相关文章:

java - xhtml 上的 JSF/Primefaces 内联单元格编辑不起作用

java - 如何将对象的一个​​元素转换为实例数组?

java - 在 Java 中使变量同步且可见

java - 使用 Spark Web 应用程序框架时出现 "Unsupported major.minor version 52.0"异常

java - Android - 服务如何在 Activity 关闭后继续运行?

java-如何处理无法连接数据库的异常?

java - Apache Isis SimpleApp 原型(prototype) - 干净运行类路径错误

嵌套 Json 对象数组的 Java 模型

java - ExcelUtils 类型的方法 setExcelFile(String, String) 未定义

java - Jackson 反序列化有界类型