Java 泛型:方法 X 不适用于参数

2023-12-20

事件处理程序.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);

Causes:

类型中的方法 HandleEvent(Object, capture#3-of ? extends E) EventHandler 不适用于 参数(对象,E)

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

EDIT1原因? super E对我不起作用是我里面有以下方法Observers class:

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

这会导致:

类型中的方法add(EventHandler) CopyOnWriteArrayList> 不适用于 参数(事件处理程序)

EDIT2

变化的原因来自? super E to E因为这个对我不起作用:当 X 扩展 Y 时,X 不适用于参数 Y https://stackoverflow.com/questions/8136302/x-is-not-applicable-for-the-arguments-y-when-x-extends-y

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


你为什么要声明mListeners成为~? extends E而不仅仅是E?

如果你使用

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

它会起作用的。

或者采用PECS(生产者扩展,消费者超)。正如其他人所建议的

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

以及相关的更改for loop.

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

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);
        }        
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 泛型:方法 X 不适用于参数 的相关文章

随机推荐