Java泛型有些复杂的陈述? [重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

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>>?这里有递归吗?

java generics
1个回答
2
投票

这仅仅意味着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();
© www.soinside.com 2019 - 2024. All rights reserved.