Java避免分层构建器模式中的类强制转换警告
有没有办法避免在这种分层构建器模式中强制转换未经检查的类Java避免分层构建器模式中的类强制转换警告,java,generics,Java,Generics,有没有办法避免在这种分层构建器模式中强制转换未经检查的类 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 bui
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;
}
是的,我知道我可以使用@SuppressWarnings是的;返回
BaseBuilder
并强制子类重写setB1
以返回它们自己。除了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;
}
}
如前所述,这是不可能做到的,因为这是不安全的<代码>B扩展了
基本生成器
,但基本生成器
(此的类型)不扩展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;
}
公共抽象类BaseBuilder{
抽象公共B getB();
公共B设置1(字符串b1){
这1.b1=b1;
返回getB();
}
抽象公共T build();
b1串;
}
不幸的是,Java不允许强制将B作为“当前”类,未经检查的警告提醒您这一点<代码>MBB1类,MBB2类
,您希望MBB1.setB1()
做什么?相关:@Saintali:他们不必返回自己。它们只需返回B
的一个实例。所以你只需要有一个返回类型B
。我没有想到像这样的把戏:public-class-builder-extensed-BaseBuilder{…
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;
}