public static class Builder<T extends Builder<T>> {
private int calories = 0;
public Builder() {}
public T calories(int val) {
calories = val;
return (T) this;
}
public NutritionFacts build() { return new NutritionFacts(this); }
}
在此代码段中,第一行public static class Builder<T extends Builder<T>>
是做什么的?这里有递归吗?
答案 0 :(得分:2)
这仅表示T
的类型必须是extends Builder
的类。参见以下示例:
public class ABuilder extends Builder<ABuilder> {
}
使用 builder模式时通常会看到此构造,因为它允许超类返回子类的实例,以便仍可以使用子类方法。在您显示的示例中:
public T calories(int val) {
calories = val;
return (T) this;
}
将允许此代码段起作用:
NutritionFacts nf = new ABuilder()
.specificMethodForABuilder() // returns ABuilder
.calories(3) // returns also ABuilder
.anotherSpecificMethodForABuilder() // returns again ABuilder
.build();
如果像这样声明calories()
方法(以及没有通用T
的构建器),将无法正常工作:
public Builder calories(int val) {
calories = val;
return this;
}
如果尝试此操作,则会出现编译错误:
NutritionFacts nf = new ABuilder()
.specificMethodForABuilder() // returns ABuilder
.calories(3) // returns only Builder
.anotherSpecificMethodForABuilder() // unknown method
.build();