使用泛型的java事件

时间:2012-06-08 14:02:27

标签: java events generics

我正在学习java泛型,并尝试为事件实现它 在有人询问之前,我已经考虑过使用多态,但是因为我希望每个事件都向处理程序的start方法发送不同的值,所以我不能这样做。

这是我的事件处理程序:

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

我的问题是如何扩展它以及为什么最后一个代码块中的MyHandler函数startEventAction不存在(对于MyEvent) 答案将非常感谢。

2 个答案:

答案 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视为类型参数,而不是类型参数。这就是为什么我通常宁愿使用字母作为类型参数而不是整个单词,这避免了它们与类和接口名称之间的混淆。

答案 1 :(得分:0)

只需更改MyEvent类声明:

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

它应该没问题。