0

タイプaAまたはbBのパラメーターを受け入れるメソッドを書きたい現在、実装されています:

import a.A;
import b.B;

...
public void doSth(A arg) {
      SpecificClass.specificMethod(arg);
}

public void doSth(B arg) {
      SpecificClass.specificMethod(arg);
}

ワイルドカードを使用し、aA または bB のみを受け入れる 1 つの汎用メソッド「doSth」が必要です。重要な情報 aA と bB は、互いのサブタイプではありません。一般的な型は java.lang.Object だけです。

何か助けはありますか?

4

3 に答える 3

1

それができると仮定すると、AとBに共通のスーパークラスがない場合、引数のメソッドを呼び出すことはできませんが、Objectのメソッドを呼び出すことはできません。

したがって、2つの合理的な解決策は次のとおりだと思います。

  • A用とB用の2つの方法があります(現在の設定)
  • オブジェクトをパラメーターとして受け取るメソッドが1つあり、引数がAまたはBのインスタンスであることを確認し、そうでない場合はIllegalArgumentExceptionをスローします。
于 2012-09-15T10:14:39.880 に答える
1

次のように、共通のインターフェイスを拡張する A と B の両方をラップできます。

interface CommonWrapper {
  public void doSth();
}

public class AWrapper implements CommonWrapper {
  private A wrapped;
  public AWrapper(A a) {
    this.wrapped = a;
  }

  public void doSth() {
    // implement the actual logic using a
  }
}

public class BWrapper implements CommonWrapper {
  private B wrapped;
  public BWrapper(B b) {
    this.wrapped = b;
  }

  public void doSth() {
    // implement the actual logic using b
  }
}

次に、CommonWrapper オブジェクトをパラメーターとして受け入れるようにメソッドdoSthを変更します。

public void doSth(CommonWrapper c) {
  c.doSth();
}
于 2012-09-15T10:29:49.387 に答える
0
public <T> void doSth(T arg) {
      SpecificClass.specificMethod(arg);
}

と呼ばれます:

yourClass.doSth(yourarg);

しかし、オブジェクトを拡張できるものに限定されるわけではありません。すべてが機能する点は何ですか。両方のクラスに共通のインターフェイスを実装してから、そのインターフェイスにプログラムすることをお勧めします。

于 2012-09-15T09:52:40.960 に答える