4

この階層ビルダー パターンで未チェックのクラス キャストを回避する方法はありますか?

public abstract class BaseBuilder <T, B extends BaseBuilder<T,B>> {

  public B setB1(String b1) {
    this.b1 = b1;
    return (B) this; // can I make this unchecked cast go away?
  }

  abstract public T build();

  String b1;
}

いいえ、答えはそうではありません:

return B.class.cast(this);

はい、@SuppressWarnings を使用できることはわかっています。

4

3 に答える 3

5

前に述べたように、これは安全ではないため、実行できません。B拡張BaseBuilder<T,B>しますが、BaseBuilder<T,B>(のタイプthis)は拡張しませんB。再帰的な境界は、Java ではほとんど役に立たず、自己型を提供しません。あなたはそれを取り除くべきです。

実装クラスが次のインスタンスを提供する必要があるように、抽象メソッドを追加できますB

public abstract class BaseBuilder <T, B> {

  abstract public B getB();

  public B setB1(String b1) {
    this.b1 = b1;
    return getB();
  }

  abstract public T build();

  String b1;
}
于 2012-12-12T22:45:15.060 に答える
2

はい; returnBaseBuilder<T, B>およびサブクラスを強制的にオーバーライドsetB1して、自分自身を返すようにします。

于 2012-12-12T18:05:30.933 に答える
1

ルイが言ったことに加えて、以下はやや素晴らしいデザインです:

public abstract class BaseBuilder ... {
    ...
    public B setB1(String b1) {
        this.b1 = b1;
        return self();
    }

    abstract protected B self();
    ...
}

public class SomeBuilder extends BaseBuilder ... {
    @override
    protected SomeBuilder self() {
        return this;
    }
}
于 2012-12-12T18:12:11.160 に答える