【问题标题】:Extend ArrayList to support events扩展 ArrayList 以支持事件
【发布时间】:2012-06-13 18:51:44
【问题描述】:

我正在尝试扩展 Java ArrayList 以支持此示例中描述的事件: http://www.exampledepot.com/egs/java.util/CustEvent.html

问题是 java 在下面的行中报告 'Cannot make a static reference to the non-static type MyEvent'

public interface MyEventListener extends EventListener {
    public void myEventOccurred(MyEvent evt);
}

我认为这与泛型有关,但我真的不知道如何解决这个问题。有人可以帮助我吗?

这是我正在尝试做的全部来源:

public class ArrayList<E> extends java.util.ArrayList<E> {

    private static final long serialVersionUID = 1L;

    // Declare the event. It must extend EventObject.
    public class MyEvent extends EventObject {

        private static final long serialVersionUID = 1L;

        public MyEvent(Object source) {

            super(source);
        }
    }

    // Declare the listener class. It must extend EventListener.
    // A class must implement this interface to get MyEvents.
    public interface MyEventListener extends EventListener {
        public void myEventOccurred(MyEvent evt); //Error occurs here
    }
}

【问题讨论】:

  • 制作你的内部类static
  • 为什么要扩展 ArrayList 以实现自定义事件
  • @mprabhat,这是由于正在构建的 Android 应用程序的设计要求。当 ArrayList 发生更改时,需要在同步的多线程进程中通知此 Android 应用程序。

标签: java generics arraylist extends


【解决方案1】:

正如其他用户所指出的,您可以在他们自己的文件中创建所有类和接口,这样就不会出现问题 - 这是一种更好的方法。如果你打算使用内部类和接口,那么你需要声明它们static

public class ArrayList<E> extends java.util.ArrayList<E> {

    private static final long serialVersionUID = 1L;

    // Declare the event. It must extend EventObject.
    public static class MyEvent extends EventObject {

        private static final long serialVersionUID = 1L;

        public MyEvent(Object source) {

            super(source);
        }
    }

    // Declare the listener class. It must extend EventListener.
    // A class must implement this interface to get MyEvents.
    public static interface MyEventListener extends EventListener {
        public void myEventOccurred(MyEvent evt); //Error occurs here
    }
}

【讨论】:

  • 我强烈建议不要为此使用静态内部类。正如您首先推荐的那样,他应该只使用标准的独立类。 1+ 赞成票
  • @HovercraftFullOfEels 我不提倡使用内部类,正如我在开头所说的那样。但是,如果 OP 设置为使用它们,那么static 是解决他的问题的方法。
  • @AleksG,非常感谢您的建议。我使用静态类测试了您的方法,它也有效。非常感谢!
【解决方案2】:

有一个更复杂的解决方案和一个更简单的解决方案。更简单的一个:不要在这里使用内部类或接口;根本没有必要,它们只会使事情复杂化。顺便说一句,为什么您的课程与核心课程的名称相同?如果这样编译(我猜是这样),那么所有人都会感到非常困惑。

编辑:在你的链接中,这些类或接口都不是内部的,所以你抄错了。同样,将每个类和接口放在自己的文件中。有时您会想要使用内部类,但这绝对不是其中之一。

【讨论】:

  • 你是对的!我没有注意到不使用内部类!非常感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2018-12-22
  • 2018-04-12
相关资源
最近更新 更多