Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型语句有点复杂? 公共静态类生成器{ 私人int卡路里=0; 公共生成器(){} 公共热量(int val){ 卡路里=val; 返回(T)这个; } public NutritionFacts build(){返回新的NutritionFacts(this);} }_Java_Generics - Fatal编程技术网

Java泛型语句有点复杂? 公共静态类生成器{ 私人int卡路里=0; 公共生成器(){} 公共热量(int val){ 卡路里=val; 返回(T)这个; } public NutritionFacts build(){返回新的NutritionFacts(this);} }

Java泛型语句有点复杂? 公共静态类生成器{ 私人int卡路里=0; 公共生成器(){} 公共热量(int val){ 卡路里=val; 返回(T)这个; } public NutritionFacts build(){返回新的NutritionFacts(this);} },java,generics,Java,Generics,从这个代码片段中,第一行是做什么的,publicstaticclassbuilder?这里有递归吗?这意味着T的类型必须是扩展生成器的类。请参见此示例: public static class Builder<T extends Builder<T>> { private int calories = 0; public Builder() {} public T calories(int val) { calories =

从这个代码片段中,第一行是做什么的,
publicstaticclassbuilder
?这里有递归吗?

这意味着
T
的类型必须是
扩展生成器的类。请参见此示例:

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 T calories(int val) {
    calories = val;
    return (T) this;
}
如果
carries()
方法是这样声明的(并且构建器没有通用的
T
),那么同样的方法将不起作用:

如果尝试以下操作,则会出现编译错误:

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

看看答案是什么。我从您发送给我的链接复制了该代码段。
(T)此
不是类型安全的。递归边界对此没有帮助。递归边界对于其他事情很有用。
NutritionFacts nf = new ABuilder()
    .specificMethodForABuilder()        // returns ABuilder
    .calories(3)                        // returns also ABuilder
    .anotherSpecificMethodForABuilder() // returns again ABuilder
    .build();
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();