ジェネリックインターフェイスを実装するクラスのサブクラス

Ipsquiggle:

私はGoogle Web Toolkitを使用していますが、汎用インターフェースの実装に問題があります。私はジェネリックにはあまり詳しくないので、他の誰かのコードをここでアップグレードします。

これが私がしたいことです:いくつかのロギングを行うジェネリックコールバックインターフェイスの実装を用意し、特定のコールバックシナリオを処理するためにその実装をサブクラス化します。

インターフェースは次のようなものです:

public interface AsyncCallback<T> {
    void MethodFromAsyncCallback(T result);
}

抽象的で具体的な実装は次のようになります。

class CallbackBase implements AsyncCallback<Object> {
    public abstract void doStuff(Object result);

    public void MethodFromAsyncCallback(Object result) {
        // IMPORTANT STUFF
        // here are things I would like to do for all callbacks, hence the superclass.

        // Then we do the subclass specific things.
        doStuff(result);
    }
}

class SpecificCallback extends CallbackBase
{
    public void doStuff(Object result) {
        Integer i = (Integer)result;
        // do stuff with i
    }
}

コールバックは以下から発生する必要があります

public interface MyServiceAsync {
    public void DoSomeThing(AsyncCallback<Integer>);
}

そして、すべてが次のような呼び出しでまとめられます。

MyServiceAsync myService = (MyServiceAsync)GWT.create(MyServiceAsync.class);
myService.DoSomeThing(new SpecificCallback());

そして、ここに問題があります!

GWT.create()私が作成したインターフェースを実装する場合、AsyncCallback指定された型を指定する必要があります(この質問の範囲外の別の場所の型と一致します)。したがってDoSomething(AsyncCallback<Integer>)、オブジェクトではなく整数を作成します。これは私の制御を超えています。

それはDoSomething()かかると文句を言うAsyncCallback<Integer>私はそれである何かから継承する何かをそれに与えていAsyncCallback<Object>ます。ジェネリックスでは、継承の概念がいくらか壊れていると思いますか?

だから私の質問はこれです:

これをどのように組み合わせて、要件DoSomething()SpecificCallback満たすことを認識できる

またはどのように私はとの関係構築できるCallbackBaseSpecificCallbackそのコードの重複を回避しているが、そのSpecificCallback実装AsyncCallback<Integer>を直接?

ありがとう。

ColinD:

あなたがする必要があると私が思うのは次のCallbackBaseように定義することです

abstract class CallbackBase<T> implements AsyncCallback<T> {
  public abstract void doStuff(T result);

  public void MethodFromAsyncCallback(T result) {
    // general stuff (T is a subclass of Object)
    doStuff(result);
  }
}

次に、特定のコールバックを次のようにします。

class SpecificCallback extends CallbackBase<Integer> {
  public void doStuff(Integer result) {
    // no need to cast
    // do stuff with result
  }
}

次に、あなたのDoSomething受け付け方法は、AsyncCallback<Integer>受け入れますSpecificCallback

(脚注:Javaではすべてのメソッドを小文字で開始してください)

編集する

価値があるのは、継承ではなく構成を使用するようにデザインを変更することです。この場合、抽象クラスを使用してCallbackBase拡張するのではなく、次のAsyncCallback<T>ような具象実装を使用します

class GeneralCallbackWrapper<T> implements AsyncCallback<T> {
  private final AsyncCallback<? super T> delegate;

  public GeneralCallbackWrapper(AsyncCallback<? super T> delegate) {
    this.delegate = delegate;
  }

  public void MethodFromAsyncCallback(T result) {
    // general stuff here
    delegate.MethodFromAsyncCallback(result);
  }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

非ジェネリックサブクラスはジェネリックスーパークラス(インターフェース)を継承(実装)

分類Dev

同じインターフェースを実装する2つのサブクラスのジェネリックメソッドの定義

分類Dev

ジェネリックインターフェースを実装するクラスの辞書

分類Dev

ジェネリックインターフェイスを実装するクラスのジェネリック型定義をクエリします

分類Dev

制約付きの別のジェネリックインターフェイスを実装するジェネリッククラスを作成するJava

分類Dev

ジェネリックス:インターフェースを実装する抽象クラスから継承

分類Dev

インターフェイスを実装するクラスのジェネリック型とのインターフェイス?

分類Dev

ジェネリックインターフェイスで実装クラスを参照する方法

分類Dev

抽象クラスはジェネリックインターフェイスタイプを実装します

分類Dev

インターフェイスを実装するジェネリッククラスからインターフェイスを返す方法は?

分類Dev

同じインターフェイスを実装する列挙型クラスのコレクションでジェネリックスを使用する

分類Dev

asmで非ジェネリッククラスを宣言する方法はジェネリックインターフェイスを実装します

分類Dev

ジェネリッククラスを指定せずにジェネリックインターフェイスを実装する

分類Dev

ジェネリックインターフェイスの非ジェネリックサブクラス

分類Dev

javaは匿名クラスにジェネリックインターフェイスを実装します

分類Dev

C#でジェネリック型のインターフェイスを実装するクラスのファクトリ?

分類Dev

ジェネリック抽象クラスをジェネリックであるインターフェースに実装する

分類Dev

ジェネリックインターフェイスを実装するクラスのC#ファクトリ

分類Dev

ジェネリック抽象クラスのインスタンスであるアセンブリ内のすべてのクラスを検索し、特定のインターフェイスを実装する方法

分類Dev

ジェネリックインターフェイスを実装するクラスをインスタンス化します

分類Dev

Scalaにジェネリックジェネリックインターフェイスを実装する

分類Dev

タイプTを比較するためのジェネリッククラスのIComparable <T>インターフェイスの実装

分類Dev

ただ、Javaのジェネリックインターフェイスを実装するクラスのメソッドを取得する方法

分類Dev

ジェネリッククラスコンストラクターが、要求されたインターフェイスを実装するオブジェクトの取得を拒否するのはなぜですか

分類Dev

C#ジェネリック:ジェネリックインターフェイスコントラクトを満たすジェネリッククラスを実装する場合のCS0311

分類Dev

Runnableインターフェースを実装するスレッドのサブクラス

分類Dev

'this'がインターフェースを実装しているかどうかを確認してから、サブクラスのジェネリック基本クラス内からそのメンバーを呼び出しますか?

分類Dev

kotlinのジェネリックス-インターフェース制限を実装するタイプ

分類Dev

2つのジェネリック型を持つ1つのインターフェースを実装するJavaクラスを作成する方法は?

Related 関連記事

  1. 1

    非ジェネリックサブクラスはジェネリックスーパークラス(インターフェース)を継承(実装)

  2. 2

    同じインターフェースを実装する2つのサブクラスのジェネリックメソッドの定義

  3. 3

    ジェネリックインターフェースを実装するクラスの辞書

  4. 4

    ジェネリックインターフェイスを実装するクラスのジェネリック型定義をクエリします

  5. 5

    制約付きの別のジェネリックインターフェイスを実装するジェネリッククラスを作成するJava

  6. 6

    ジェネリックス:インターフェースを実装する抽象クラスから継承

  7. 7

    インターフェイスを実装するクラスのジェネリック型とのインターフェイス?

  8. 8

    ジェネリックインターフェイスで実装クラスを参照する方法

  9. 9

    抽象クラスはジェネリックインターフェイスタイプを実装します

  10. 10

    インターフェイスを実装するジェネリッククラスからインターフェイスを返す方法は?

  11. 11

    同じインターフェイスを実装する列挙型クラスのコレクションでジェネリックスを使用する

  12. 12

    asmで非ジェネリッククラスを宣言する方法はジェネリックインターフェイスを実装します

  13. 13

    ジェネリッククラスを指定せずにジェネリックインターフェイスを実装する

  14. 14

    ジェネリックインターフェイスの非ジェネリックサブクラス

  15. 15

    javaは匿名クラスにジェネリックインターフェイスを実装します

  16. 16

    C#でジェネリック型のインターフェイスを実装するクラスのファクトリ?

  17. 17

    ジェネリック抽象クラスをジェネリックであるインターフェースに実装する

  18. 18

    ジェネリックインターフェイスを実装するクラスのC#ファクトリ

  19. 19

    ジェネリック抽象クラスのインスタンスであるアセンブリ内のすべてのクラスを検索し、特定のインターフェイスを実装する方法

  20. 20

    ジェネリックインターフェイスを実装するクラスをインスタンス化します

  21. 21

    Scalaにジェネリックジェネリックインターフェイスを実装する

  22. 22

    タイプTを比較するためのジェネリッククラスのIComparable <T>インターフェイスの実装

  23. 23

    ただ、Javaのジェネリックインターフェイスを実装するクラスのメソッドを取得する方法

  24. 24

    ジェネリッククラスコンストラクターが、要求されたインターフェイスを実装するオブジェクトの取得を拒否するのはなぜですか

  25. 25

    C#ジェネリック:ジェネリックインターフェイスコントラクトを満たすジェネリッククラスを実装する場合のCS0311

  26. 26

    Runnableインターフェースを実装するスレッドのサブクラス

  27. 27

    'this'がインターフェースを実装しているかどうかを確認してから、サブクラスのジェネリック基本クラス内からそのメンバーを呼び出しますか?

  28. 28

    kotlinのジェネリックス-インターフェース制限を実装するタイプ

  29. 29

    2つのジェネリック型を持つ1つのインターフェースを実装するJavaクラスを作成する方法は?

ホットタグ

アーカイブ