假设有两个简单的类:
@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我不知道我会错过什么。
Run Code Online (Sandbox Code Playgroud)C:\Dev\companyproject\src\main\java\com\companyproject\entity\Person.java:12 java: type com.companyproject.entity.Party.PartyBuilder does not take parameters
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使用子类型构建器调用在这里工作正常的原因。
| 归档时间: |
|
| 查看次数: |
9838 次 |
| 最近记录: |