代码之家  ›  专栏  ›  技术社区  ›  Aidenhjj

对已经泛型的类使类型参数递归合法吗?

  •  1
  • Aidenhjj  · 技术社区  · 6 年前

    class Foo<T> {}
    

    这样做合法吗?

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

    就上下文而言,我试图实现 this

    2 回复  |  直到 6 年前
        1
  •  1
  •   Ondřej Fischer    6 年前

    我不确定你的评论中是否有你的附加问题。但是让我们试着解释一下。

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

    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> {}
    
        2
  •  1
  •   memo    6 年前

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

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

    来自JRE。