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 中几乎从来没有用过,并且不给你 self 类型。你应该摆脱它。

您可以添加一个抽象方法,以便实现类必须提供以下实例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 回答