Lombok @SuperBuilder 不接受参数

Nik*_*las 11 java lombok

假设有两个简单的类:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Party {

    protected Long id;
    protected String status;
}
Run Code Online (Sandbox Code Playgroud)
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Person extends Party {

    private String name;
    private Long sex;
}
Run Code Online (Sandbox Code Playgroud)

编译失败并出现以下错误。阅读龙目岛 | @SuperBuilder我不知道我会错过什么。

C:\Dev\companyproject\src\main\java\com\companyproject\entity\Person.java:12
java: type com.companyproject.entity.Party.PartyBuilder does not take parameters
Run Code Online (Sandbox Code Playgroud)

Tom*_*Tom 17

这里的问题是@Builder父类上的注释不正确。提及的@SuperBuilder文档:

最重要的是,它要求所有超类也有@SuperBuilder注释。

所以正确的父类是:

@Data
@SuperBuilder     // <- annotation replaced here
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Party {

    protected Long id;
    protected String status;
}
Run Code Online (Sandbox Code Playgroud)

附录:

两个注释之间的关键区别在于,@SuperBuilder还创建了需要相应构建器参数的类的构造函数。

因为Party它看起来像:

protected Party(PartyBuilder<?, ?> b) {
    this.id = b.id;
    this.status = b.status;
}
Run Code Online (Sandbox Code Playgroud)

和对于Person

protected Person(PersonBuilder<?, ?> b) {
    super(b);
    this.name = b.name;
    this.sex = b.sex;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,子类构造函数想要将其自己的构建器传递给父类构造函数,并且只有在存在匹配的构造函数时才可能实现这一点,并且@Builder不会生成它。

PersonBuilder<>扩展了PartyBuilder<>,这就是为什么super使用子类型构建器调用在这里工作正常的原因。