Java在分层构建器模式中避免类转换警告

时间:2012-12-12 17:59:14

标签: java generics

有没有办法在这种分层的Builder模式中避免未经检查的类转换?

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

3 个答案:

答案 0 :(得分:4)

如前所述,这是不可能的,因为它不安全。 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;
}

答案 1 :(得分:2)

是;返回BaseBuilder<T, B>并强制子类覆盖setB1以返回自己。

答案 2 :(得分:0)

除了louis所说的以下是一个有点好的设计:

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;
    }
}