Java泛型:方法X不适用于参数
EventHandler.java:Java泛型:方法X不适用于参数,java,Java,EventHandler.java: public abstract class EventHandler<E extends EventArgs> { public abstract void HandleEvent(Object sender, E e); } 原因: 类型中的方法HandleEvent(对象,捕获#3-of?扩展了E) EventHandler不适用于 参数(对象,E) 有人知道怎么解决这个问题吗 EDIT1 原因是什么?super E对我不起作用,
public abstract class EventHandler<E extends EventArgs> {
public abstract void HandleEvent(Object sender, E e);
}
原因:
类型中的方法HandleEvent(对象,捕获#3-of?扩展了E)
EventHandler不适用于
参数(对象,E)
有人知道怎么解决这个问题吗
EDIT1
原因是什么?super E对我不起作用,因为我在Observators
类中有以下方法:
public void addListener(EventHandler<? super E> listener) {
mListeners.add(listener);
}
public void addListener(EventHandler使用?super E
而不是?extends E
更改
for (EventHandler<? extends E> listener : mListeners) {
for(EventHandler为什么要将mListeners
声明为~?扩展E
,而不仅仅是E
如果你使用
private CopyOnWriteArrayList<EventHandler<E>> mListeners = new CopyOnWriteArrayList<EventHandler<E>>();
什么EventHandler将观察者更改为:
public static class Observers<E extends EventArgs> {
private CopyOnWriteArrayList<EventHandler<E>> mListeners = new CopyOnWriteArrayList<EventHandler<E>>();
public void dispatchEvent(Object sender, E args) {
if (mListeners != null) {
for (EventHandler<E> listener : mListeners) {
listener.HandleEvent(sender, args);
}
}
}
}
公共静态类观察员{
private CopyOnWriteArrayList mListeners=new CopyOnWriteArrayList();
public void dispatchEvent(对象发送方,E参数){
如果(mListeners!=null){
for(EventHandler侦听器:mListeners){
listener.HandleEvent(发送方,args);
}
}
}
}
E已经在类定义中定义为扩展EventArgs,它不需要在每次后续使用中重新定义。args的类型是什么
?请发布一个复制错误的最小示例。这是一个编译时错误。它只是不编译**编辑**更改
私有CopyOnWriteArrayListperEdit2
,是的,但是您的Observer类只有一个E
,如果您的侦听器需要E
的子类,那么将E
传递给它将不起作用,因为E
可能是一个G
而不是F
,似乎所有侦听器都应该实现EventHandler
,并执行操作ode>instanceof
并根据需要进行转换。@LAS_VEGAS,已更新。我认为您只需要保持通配符之间的一致性。从您的示例中,实际上并不清楚您试图实现什么。提供的答案仅满足您的要求,但可能不符合您的要求。感谢更新,但现在我发现了错误,我很抱歉注意:我想创建一个C#的监听器接口。我想让我的所有观察者推动抽象的EventHandler
类,只接受EventArgs
类的子类的参数。啊,这是一个问题不清楚的例子。当你在问题中提供半个故事时,人们只能提供一半答案中有一个故事。你也不应该把一个问题分成多个问题,现在弄清楚到底发生了什么有点困难。我会尝试合并和更新。@LAS_VEGAS,你将不得不用一套完整的类更新问题。没有足够的信息来确定你有什么。请简单地包括一个单独的类,使用静态内部类而不是大量的类文件,如上面的Sandbox。这样可以更容易地复制/粘贴到IDE中并查看发生了什么。将集合的声明更改为Match I cannotadd
是一个库方法(在CopyOnWriteArrayList
中定义)请在问题级别查看我的注释
for (EventHandler<? super E> listener : mListeners) {
private CopyOnWriteArrayList<EventHandler<E>> mListeners = new CopyOnWriteArrayList<EventHandler<E>>();
private CopyOnWriteArrayList<EventHandler<? super E>> mListeners = new CopyOnWriteArrayList<EventHandler<? super E>>();
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);
}
}
}
public static class Observers<E extends EventArgs> {
private CopyOnWriteArrayList<EventHandler<E>> mListeners = new CopyOnWriteArrayList<EventHandler<E>>();
public void dispatchEvent(Object sender, E args) {
if (mListeners != null) {
for (EventHandler<E> listener : mListeners) {
listener.HandleEvent(sender, args);
}
}
}
}