Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型:方法X不适用于参数_Java - Fatal编程技术网

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

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对我不起作用,

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对我不起作用,因为我在
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的类型是什么
?请发布一个复制错误的最小示例。这是一个编译时错误。它只是不编译**编辑
**更改
私有CopyOnWriteArrayListper
Edit2
,是的,但是您的Observer类只有一个
E
,如果您的侦听器需要
E
的子类,那么将
E
传递给它将不起作用,因为
E
可能是一个
G
而不是
F
,似乎所有侦听器都应该实现
EventHandler
,并执行操作ode>instanceof
并根据需要进行转换。@LAS_VEGAS,已更新。我认为您只需要保持通配符之间的一致性。从您的示例中,实际上并不清楚您试图实现什么。提供的答案仅满足您的要求,但可能不符合您的要求。感谢更新,但现在我发现了错误,我很抱歉注意:我想创建一个C#的监听器接口。我想让我的所有观察者推动抽象的
EventHandler
类,只接受
EventArgs
类的子类的参数。啊,这是一个问题不清楚的例子。当你在问题中提供半个故事时,人们只能提供一半答案中有一个故事。你也不应该把一个问题分成多个问题,现在弄清楚到底发生了什么有点困难。我会尝试合并和更新。@LAS_VEGAS,你将不得不用一套完整的类更新问题。没有足够的信息来确定你有什么。请简单地包括一个单独的类,使用静态内部类而不是大量的类文件,如上面的Sandbox。这样可以更容易地复制/粘贴到IDE中并查看发生了什么。将集合的声明更改为Match I cannot
add
是一个库方法(在
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);
      }
    }
  }
}