Я не уверен, правильно ли я получил ваш дополнительный вопрос в вашем комментарии. Но давайте попробуем объяснить.
Класс с тем, что вы называете "рекурсивным параметром", определенно допустим и имеет смысл.
Используется в "расширяемых" сборщиках. Давайте посмотрим на следующий пример:
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> {}