Разрешено ли делать параметр типа рекурсивным для уже обобщенного класса? - PullRequest
0 голосов
/ 07 ноября 2018

Если у меня есть класс:

class Foo<T> {}

Это законно / имеет ли смысл это делать?

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

Для контекста я пытаюсь реализовать этот шаблон для Builder, который уже имеет один универсальный параметр.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Я не уверен, правильно ли я получил ваш дополнительный вопрос в вашем комментарии. Но давайте попробуем объяснить.

Класс с тем, что вы называете "рекурсивным параметром", определенно допустим и имеет смысл.

Используется в "расширяемых" сборщиках. Давайте посмотрим на следующий пример:

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> {}
0 голосов
/ 07 ноября 2018

Да, допустимо иметь рекурсивные универсальные типы. Канонический пример:

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

от JRE.

...