事件处理程序.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(使用前将#替换为@)