Наследование для строителей в ломбоке

Я пытался использовать ломбок для своего проекта.

У меня есть класс A:

@Data
@Builder
public class A {
    Integer a1;
}

и класс B:

@Data
public class B extends A {
    Integer b1;

    @Builder
    public B(Integer b1, Integer a1) {
        super(a1);
        this.b1 = b1;
    }
}

Я получаю сообщение об ошибке, когда builder() в B не может переопределить builder() в A, поскольку тип возврата в BBuilder несовместим с типом возврата в ABuilder.

Есть ли способ сделать это с помощью ломбока? Я не хочу писать полный конструктор для B, если у меня нет другого варианта.

PS: Я дал явный конструктор для класса B из-за проблемы. Я пробовал искать, но я не мог найти хорошее решение для того же самого. Любая помощь действительно ценится.

Ответы

Ответ 1

Здесь нам просто нужно вызвать супер строителя.

@Data
public class B extends A {
    Integer b1;

    @Builder
    public B(Integer b1, Integer a1) {
        super(a1);
        this.b1 = b1;
    }

    public static class BBuilder extends ABuilder{
            BBuilder() {
                super();
            }
    }
}

Ответ 2

Ломбок представил экспериментальные функции с версией: 1.18.2 для проблем наследования, связанных с аннотацией Builder, и может быть разрешен с помощью аннотации @SuperBuilder

Используйте версию lombok: 1.18.2, аннотации @SuperBuilder в классе child/parent

Ответ 3

Если вы используете Lombok 1.18.4 вместе с IntelliJ, вам подойдет следующий код:

@Data
@Builder
class A {
    Integer a1;
}

@Data
class B extends A {
    Integer b1;

    @Builder (builderMethodName = "BBuilder")
    public B(Integer b1, Integer a1) {
        super(a1);
        this.b1 = b1;
    }
}

public class Main {

    public static void main(String[] args){
    System.out.println(B.BBuilder().a1(1).b1(1).build());

    }
}

С другой стороны, аннотация @SuperBuilder не работала в IntelliJ во время написания этого ответа. Если у вас многоуровневое наследование, пожалуйста, избегайте Lombok, иначе это сделает ваши Java-модели беспорядочными.