Цепное наследование с шаблоном построения

#java

#java

Вопрос:

у меня проблема с правильным использованием этого шаблона в Java generics, или, возможно, он вообще не будет работать. Я хотел бы иметь 2 абстрактных класса и обычный. Каждый дочерний класс привносит в классы свои собственные параметры. С моей точки зрения, похоже, что я напортачил с дженериками, но я понятия не имею, где.

 public abstract class First {

private final long id;

First(Builder<?> builder) {
    this.id = builder.getId();
}


public static abstract class Builder<T extends Builder<T>> {

    @Getter long id;

    public abstract First build();

    public T setID(long id) {
        this.id = id;
        return (T)self();
    }

    protected abstract T self();
}
  

второй:

 public abstract class Second extends First {

Second(Builder<?> builder) { 
    super(builder);
}


public static abstract class Builder<T extends Builder<T>> extends First.Builder {

    public T print() {
        System.out.println("hi");
        return (T) self();
    }

}
}
  

и в-третьих:

 public class Third extends Second {

private Third(Builder builder) {
    super(builder);
}

public static class Builder<T extends Builder<T>> extends Second.Builder {

    public Third build() {

        return new Third(this);
    }

    @Override
    protected Builder self() {
        return this;
    }
}

}
  

моя проблема в том, что я могу вызвать:

 new Third.Builder()
            .print()
            .setID(1)
            .build();
  

но не:

 new Third.Builder()
            .setID(1)
            .print()
            .build();
  

java дает мне:

 Error:(13, 17) java: cannot find symbol
symbol:   method print()
location: class blub.First.Builder
  

Комментарии:

1. Используйте Lombok @SuperBuilder и избавьте себя от лишних хлопот

2. я проверю это