我实现了基于模式这answer 我有以下asbtract配置:Builder模式
public abstract class AbstractConfig {
public static abstract class Builder<B extends Builder<B>> {
private int calories = 0;
public Builder() {
}
public B setCalories(int calories) {
this.calories = calories;
return (B) this;
}
public abstract AbstractConfig build();
}
private int calories = 0;
protected AbstractConfig(final Builder builder) {
calories = builder.calories;
}
}
而且我有以下具体配置:
public class DialogConfig extends AbstractConfig {
public static class DialogConfigBuilder<B extends DialogConfigBuilder<B>> extends Builder<B> {
private double width;
private double height;
public DialogConfigBuilder() {
//does nothing.
}
public B setWidth(final double value) {
width = value;
return (B) this;
}
public B setHeight(final double value) {
height = value;
return (B) this;
}
public DialogConfig build() {
return new DialogConfig(this);
}
}
private final double width;
private final double height;
protected DialogConfig(final DialogConfigBuilder builder) {
super(builder);
width = builder.width;
height = builder.height;
}
public double getWidth() {
return width;
}
public double getHeight() {
return height;
}
}
这是我如何使用它
DialogConfig config = new DialogConfig.DialogConfigBuilder()
.setWidth(0)
.setCalories(0)
.setHeight(0) //X LINE
.build();
在X l我得到 - 找不到符号方法setHeight。我的错误是什么?
EDIT - 我将拥有一个ExtendedDialogConfig,它必须扩展DialogConfig等。我的意思是会有其他的子类。
您正在使用原始类型,这意味着'B'解析为'Builder'。将类声明更改为'DialogConfigBuilder extends Builder'类。 –
shmosel
请注意,您应该谨慎复制该解决方案,因为它也[使用原始类型](https://stackoverflow.com/questions/17164375/subclassing-a-java-builder-class/17165079#comment59589591_17165079)。 – shmosel
@shmosel比你的评论。但是如果我更改为类DialogConfigBuilder extends Builder'我可以在SuperDialogConfig中扩展DialogConfig吗?我认为,如果我按照你的建议,然后setCalories()将返回DialogConfig但不是SuperDialogConfig。 –