2012-06-10 44 views
1

我正嘗試在這個例子中所描述的擴展的Java的ArrayList支持事件: http://www.exampledepot.com/egs/java.util/CustEvent.htmlArrayList的擴展支持事件

的問題是,Java是報告說「不能讓一個靜態參照非在下面的行-static型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 
    } 
} 
+0

使您的內部類爲'static'。 –

+0

爲什麼要擴展ArrayList以實現自定義事件實現 – mprabhat

+0

@mprabhat,這是由於正在構建的Android應用程序的設計要求所致。在同步多線程進程中更改ArrayList時,需要通知此Android應用程序。 – regisxp

回答

1

還有一個更復雜的解決方案和更簡單的一個。更簡單的一個:不要在這裏使用內部類或接口;根本沒有必要,而且只會使問題複雜化。順便說一句,爲什麼你的班級與核心班級有相同的名字?如果編譯(我猜測它確實),這對所有人來說都是非常混亂的。

編輯:在你的鏈接中,這些類或接口都不是內在的,所以你已經把它寫錯了。再次,將每個類和接口放在它自己的文件中。有時你會想要使用內部類,但這絕對不是其中之一。

+0

你是對的!我沒有注意到不使用內部類。非常感謝您的建議! – regisxp

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

我強烈建議不要爲此使用靜態內部類。你應該首先推薦使用標準的獨立課程。 1 + up-vote –

+0

@HovercraftFullOfEels我不主張使用內部類,正如我在開始時所說的。但是如果OP使用它們,那麼'static'就是解決他的問題的方法。 –

+0

是的,我編輯了我的評論,並投了票。 –