我實現了基於模式這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。 –