Java 龙目岛建筑商的遗产

Java 龙目岛建筑商的遗产,java,inheritance,design-patterns,builder,lombok,Java,Inheritance,Design Patterns,Builder,Lombok,我试图在我的项目中使用lombok 我有一个甲级: @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; } } 我收到一个错误,说B中的build

我试图在我的项目中使用lombok

我有一个甲级:

@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;
    }
}
我收到一个错误,说B中的builder()不能覆盖A中的builder(),因为BBuilder中的返回类型与ABuilder中的返回类型不兼容

有没有什么方法可以用lombok做到这一点? 我不想为B编写完整的生成器,除非我没有其他选择

PS:我已经给出了类B的显式构造函数,原因是。
我尝试过搜索,但找不到一个好的解决方案。

这里我们只需要调用生成器的super

@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();
            }
    }
}

Lombok在版本1.18.2中引入了实验性功能,用于解决Builder注释面临的继承问题,并且可以通过@SuperBuilder注释解决


请使用lombok版本:1.18.2,子/父类中的@SuperBuilder注释

如果您将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模型变得混乱。

如果您的父类已经有了
@Builder
,那么您的子类应该标记为
@SuperBuilder

将父级和子级同时作为
@Builder
将不起作用

A类家长:

B类儿童:


如果父类也有@Builder注释,则此解决方案将不起作用。
@Data
@Builder
public class A {
    Integer a1;
}
@Data
@SuperBuilder
public class B extends A {
    Integer b1;
}