Java泛型有些复杂吗?

时间:2019-04-10 08:11:45

标签: java generics

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>>是做什么的?这里有递归吗?

1 个答案:

答案 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();