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