gpt4 book ai didi

Java泛型的声明有点复杂?

转载 作者:行者123 更新时间:2023-11-30 01:52:32 25 4
gpt4 key购买 nike

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的类型必须是扩展Builder的类。请参阅此示例:

public class ABuilder extends Builder<ABuilder> {

}

这种构造在使用构建器模式时很常见,因为它允许父类(super class)返回子类的实例,以便仍然可以使用子类方法。从您展示的示例来看:

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

关于Java泛型的声明有点复杂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55607737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com