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 E
到 E
对我不起作用,因为:
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/