为已经通用的类使类型参数递归合法吗?

时间:2018-11-07 12:56:20

标签: java generics builder

如果我有课:

class Foo<T> {}

这样做合法吗?

class Foo<T, R extends Foo<T, R>> {}

对于上下文,我正在尝试为已经具有一个通用参数的Builder实现this模式。

2 个答案:

答案 0 :(得分:1)

是的,具有递归泛型类型是合法的。典型的例子是

package java.lang;
public abstract class Enum<E extends Enum<E>>

来自JRE。

答案 1 :(得分:1)

我不确定,是否可以在您的评论中正确回答您的其他问题。但是,让我们尝试解释一下。

带有您所谓的“递归参数”的类绝对是合法的,并且很有意义。

在“可扩展”构建器中使用。让我们看下面的例子:

public interface BaseBuilder<T, B extends BaseBuilder<T,B> {
    B add(String field, String value);

    default B person(String firstName, String lastName) {
        // This chaining is only possible thanks to that recursive parameter
        return add("firstName", firstName).add("lastName", lastName);
    }

    T build();

    default T buildPerson(String firstName, String lastName) {
        return person(firstName, lastName).build();
    }
}

您可以重复使用此功能,例如像这样:

 public interface MyBuilder<T> extends BaseBuilder<T, MyBuilder<T> {}