Java避免在分层Builder模式中进行类强制转换警告

Eri*_*ric 3 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;
}
Run Code Online (Sandbox Code Playgroud)

不,答案不是:

return B.class.cast(this);
Run Code Online (Sandbox Code Playgroud)

是的,我知道我可以使用@SuppressWarnings

new*_*cct 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;
}
Run Code Online (Sandbox Code Playgroud)