有没有办法在这种分层的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
答案 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;
}
}