这个问题在这里已有答案:
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>>
?这里有递归吗?
这仅仅意味着T
的类型必须是extends Builder
的类。看这个例子:
public class ABuilder extends Builder<ABuilder> {
}
在使用构建器模式时,通常会看到此构造,因为它允许超类返回子类的实例,以便仍可以使用子类方法。从您展示的示例中:
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();