2012-06-08 54 views
1

我正在學習java泛型,並試圖在事件 之前實現它,因爲我曾考慮過使用多態,但由於我希望每個事件向處理程序的啓動方法發送不同的值,不要這樣做。使用泛型的java事件

這是我的事件處理程序:

public class MyHandler { 
     public void startEventAction(int num) { 
     //do something with num 
     } 
    } 

這是我的模板事件:

 public abstract class SomeEvent<E> { 
     protected List<E> handler_list = new LinkedList<E>(); 
     public SomeEvent() { 
     } 
     public Boolean addHandler(E handler) { 
      return handler_list.add(handler); 
     } 
     public Boolean removeHandler(E handler) { 
      return handler_list.remove(handler); 
     } 
    } 

和事件本身是:(現在我知道這是可能是錯誤的,延長SomeEvent這樣,但它似乎工作)

public class MyEvent<MyHandler> extends SomeEvent<MyHandler> { 
     public void executeHandlers() { 
     for (MyHandler handler : handler_list) { 
      //Exception here!! 
      handler.startEventAction(num); 
     } 
     } 
    } 

我的問題是它是如何正確擴展它,爲什麼有趣ction startEventAction在最後一個代碼塊(MyEvent)中不存在MyHandler 回答將非常感謝。

+0

在Java中沒有這樣的模板。例如,它被稱爲泛型,並不像「C++」中的模板。 – maba

+0

好的抱歉,我知道這是泛型,但這只是語義學..我知道差異,但這不是我的問題 –

+0

現在這裏是固定的 –

回答

2

我覺得應該是

public class MyEvent<T extends MyHandler> extends SomeEvent<T> { 
      public void executeHandlers() {   
        for (T handler : handler_list) { 
            //Exception here!! 
            handler.startEventAction(lvc_count); 
        } 
    } 

如果使用MyEvent<MyHandler>你正在考慮MyHandler作爲一個類型參數,而不是一個類型參數。這就是爲什麼我通常寧願使用字母作爲類型參數而不是整個單詞,這就避免了它們與類和接口名稱之間的混淆。

+0

非常感謝你,它似乎工作,我只需要現在就測試它:) –

0

簡單地改變MyEvent類聲明:

public static class MyEvent extends SomeEvent<MyHandler> { ... } 

,它應該是罰款。