5

だから私はこのインターフェースを持っています

public interface EventHandler<E extends EventObject>
{   
    public void handleEvent(E event);
}

そして、次のように、イベントを処理するクラスを派生させたいと思います。

public class WorkingHandler implements EventHandler<MouseEvent>
{
    public void handleEvent(MouseEvent event)
    {
        //handle event
    }
}

上記の例は正常に機能します。しかし、非常に苛立たしい型消去のため、コンパイラーはEventHandlerを複数回実装することを許可しません。

public class NotWorkingHandler implements EventHandler<MouseEvent>, EventHandler<KeyEvent>
{
    public void handleEvent(MouseEvent event)
    {
        //handle mouse event
    }

    public void handleEvent(KeyEvent event)
    {
        //handle key event
    }
}

いくつかの質問...

  1. Javaが型消去を許可しないのはなぜですか?IIRCは、以前のバージョンのJavaと互換性があることと関係がありますね。

編集:私はなぜJavaが型消去を持っているのかを意味します(逆にそれを持っていました)

  1. 型消去を回避するための「mod」/「extension」(より良い単語がないため)またはプログラミング言語はありますか?古いバージョンのJavaを使用していないので、コードが古いコードと互換性があるかどうかは気にしません。

  2. Java言語内で、型消去を回避するために使用できる回避策はありますか?

  3. いいえの場合、コンパイラを満足させるプログラムでイベント処理をコーディングするための代替方法は何ですか?

4

4 に答える 4

5

1つのオプションは、GuavaEventBusを使用してサブ スクライバーにイベントを投稿することです。特に、現在直面している問題に対処するように設計されています。

これを使用すると、インターフェイスを実装する必要はありません...次の@Subscribeような2つのメソッドを提供するだけです。

@Subscribe
public void handleKeyEvent(KeyEvent event) { ... }

@Subscribe
public void handleMouseEvent(MouseEvent event) { ... }

それに関するいくつかの追加のドキュメントは、 Guavawikiで入手できます。

于 2012-04-15T22:32:06.247 に答える
2

型消去は、JVMがジェネリック型について何も知る必要がないことを意味するので便利です。これは、ジェネリック型を使用してもパフォーマンスに影響がないことも意味します。

また、バイナリ互換性を維持する必要があるというあなたの考えは、(型消去チュートリアルに示されているように)的を射ています。型消去により、Javaがジェネリック型を許可する前に記述されたコードがジェネリックを使用して記述されたJavaコードとシームレスに相互運用できるようになります。

単純に2つのハンドラーを作成し、両方をアタッチするのはどうですか?

public class KeyHandler implements EventHandler<KeyEvent>
{
    public void handleEvent(KeyEvent event)
    {
        //handle key event
    }
}

public class MouseHandler implements EventHandler<MouseEvent>
{
    public void handleEvent(MouseEvent event)
    {
        //handle mouse event
    }
}
于 2012-04-15T22:28:51.283 に答える
1
  1. はい、型消去は、新しいバージョン(ジェネリックを実装するもの)を実行するためにJVMの仕様を変更する必要がないように実装されています。

  2. 他の人が指摘しているように、多くの言語は型消去を実装していません。Java内を探している場合は、おそらくですが、よくわかりません。1のため、標準のJVMでは機能しません。

  3. 一般的なイベントハンドラーを実行できます。

public class GenericHandler implements EventHandler<EventObject> 
{ 
  public void handleEvent(EventObject event) 
  { 
    if (event instanceof MouseEvent) {
      MouseEvent mouseEvent = (MouseEvent) event;
      //handle mouse event 
    } else if (event instanceof KeyboardEvent) {
      KeyboardEvent keyboardEvent = (KeyboardEvent) event;
      //handle keyboard event 
    }
  } 
} 

最もエレガントではありませんが、機能します:)

于 2012-04-15T22:34:49.947 に答える
1

Javaでの型消去についてのあなたの理解が正しいかどうかはわかりません。ここで説明するように、ジェネリッククラスの型は実行時に失われます。

あなたの質問に答えて:

  1. Javaが型消去を実装して、以前のバージョンの言語との互換性を有効にしているのは正しいと思います。
  2. いいえ、「mod」はないと思います。
  3. 回避策はありません(コンパイル時に型が削除されます)が、リフレクションを使用できます。
  4. 下記参照。

より簡単な解決策は、次のようなものになると思います。

public class WorkingHandler implements EventHandler<EventObject>
{
    public void handleEvent(EventObject event)
    {
        // handle event
        if (event instanceof MouseEvent)
            handleMouseEvent((MouseEvent) event);
        ...
    }

    ...

    private void handleMouseEvent(MouseEvent event)
    {
        // handle mice
    }
}
于 2012-04-15T22:37:16.140 に答える