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 に答える