首页 > 解决方案 > Java泛型声明有点复杂?

问题描述

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

标签: javagenerics

解决方案


这仅仅意味着 of 的类型T必须是一个类 that 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()如果方法是这样声明的(以及没有 generic 的构建器) ,同样的方法也不起作用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();

推荐阅读