2

メソッドをオーバーライドして、取得するパラメーターをそのパラメーターのサブクラスに置き換えたいと思います。

リターンタイプの場合、メソッドシグネチャの一部ではなく、サブクラス(「共変リターンタイプ」と呼ばれる)に置き換えることができるため、問題はありません。引数の場合、署名の一部であるため、これは機能しません。

そこで、同じタイプのジェネリックパラメーターを使用するソリューションを考え出しました。

public abstract class A<T extends A> {

  public void loadValuesFrom(T source) {
    ...
  }

}

public class B extends A<B> {

  public void loadValuesFrom(B source) {
    super.loadValuesFrom(source);
    ...    
  }

}

しかし、「パブリック抽象クラスA」というステートメントは私には奇妙に見えます。これを達成する他の方法はありますか?「共変パラメータタイプ」はありますか?:-)

4

1 に答える 1

1

パラメータタイプでなければならない場合は、ジェネリックスを使用するのがおそらく最良のオプションです。クラス宣言の生の型を避けるために、マイナーな修正を行うだけです。

public abstract class A<T extends A<T>> {

ただし、初期化するオブジェクトを新たに作成する必要がある特別な場合は、メソッドに作成を含めることができます。これにより、そのオブジェクトをパラメーターとして渡す必要がなくなります。

public abstract class A {
    public A clone() {

    }
}

public class B extends A {
    public B clone() {
        // copy state
    }
}
于 2011-04-06T12:33:48.533 に答える