1

我正在学习 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);
        }
      }
    }

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

4

2 回答 2

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

于 2012-06-08T14:11:04.677 回答
0

只需更改MyEvent类声明:

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

应该没问题。

于 2012-06-08T14:23:14.510 回答