java - 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>>
?这里有递归吗?
解决方案
这仅仅意味着 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();
推荐阅读
- android-studio - Android Studio 3.2.1:“初始化 ADB 时出错:找不到 Android 调试桥”
- javascript - 如何将 C# 枚举列表传递和使用到 Javascript 文件并在其中使用
- c# - 在 C# 中获取实际打印结束的时刻
- javascript - 像在 Web 上一样显示 PDF
- firebase - Firebase Cloud Firestore 限制用户访问(银行应用程序)
- spring - 我希望 maven 在创建新的 maven 快速入门项目时始终使用 JRE 系统库 [JavaSE 1.8]
- jquery - ASP .NET MVC 5在用户开始在搜索框中输入时立即在表格中显示搜索记录而无需单击任何按钮
- java - 在 ubuntu 桌面上跟踪突出显示的文本
- git - git rebase 一个不包含新提交的分支,不需要 - 推送所需的力?
- shopify - shopify中的配置部分