扩展ArrayList以支持事件

时间:2012-06-10 16:41:49

标签: java generics arraylist extends

我正在尝试扩展Java ArrayList以支持事件,如本例所述: http://www.exampledepot.com/egs/java.util/CustEvent.html

问题是java报告'无法对以下行中的非静态类型MyEvent'进行静态引用:

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

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

以下是我尝试做的完整资料来源:

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
    }
}

2 个答案:

答案 0 :(得分:2)

正如其他用户所指出的,您可以在自己的文件中执行所有类和接口,然后就不会出现问题 - 这是一种更好的方法。如果您打算使用内部类和接口,则需要声明它们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 :(得分:1)

有一个更复杂的解决方案和一个更简单的解决方案。更简单的一个:不要在这里使用内部类或接口;根本没有必要,他们只会使问题复杂化。顺便说一下,为什么你的课程与核心课程同名?如果那个编译(我猜它确实如此),那对所有人来说都是非常困惑的。

编辑:在你的链接中,这些类或接口都不是内在的,所以你已经错误地转录了它。再次,将每个类和接口放在自己的文件中。有时你会想要使用内部类,但这绝对不是其中之一。