强制转换为java中的类型

时间:2016-07-04 17:47:31

标签: java generics casting

我是仿制药的新手,正在看这个答案:

https://stackoverflow.com/a/17165079/1632141

它完美无缺,但我无法理解代码的这一部分是如何工作的。

 public T calories(int val) {
     calories = val;
     return (T) this;
 }

NutritionFacts的内部类中。

演员是如何在这里工作的?我在这里期待java.lang.ClassCastException,因为我们正在将纯超类对象转换为子类。

2 个答案:

答案 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个对象,因此它是一个有效的类型转换。