我是仿制药的新手,正在看这个答案:
https://stackoverflow.com/a/17165079/1632141
它完美无缺,但我无法理解代码的这一部分是如何工作的。
public T calories(int val) {
calories = val;
return (T) this;
}
在NutritionFacts
的内部类中。
演员是如何在这里工作的?我在这里期待java.lang.ClassCastException
,因为我们正在将纯超类对象转换为子类。
答案 0 :(得分:2)
实际上这个答案存在问题:
public static class Builder<T extends Builder> {...
类型T
是原始类型。它应该是:
public static class Builder<T extends Builder<T>> {...
称为自引用类型,因为它会自行扩展。
它通常使用如下:
public class SubBuilder extends Builder<SubBuilder> {...
在这种情况下,类型是子类本身的类型。
您可以将Builder的另一个子类编码为类型,但这不会特别有用。
答案 1 :(得分:-1)
您没有将超类对象转换为子类。对于GMOFacts.Builder
对象,calories
方法的类型将被删除为:
public GMOFacts.Builder calories(int val) {
calories = val;
return (GMOFacts.Builder) this;
}
this
引用无论如何都指向GMOFacts.Builder
个对象,因此它是一个有效的类型转换。