我尝试对具有注解的类使用继承 @SuperBuilder
. 我有一个超类:
@SuperBuilder
@Data
public class BaseClass {
private String userID;
private String clientID;
}
和两个扩展的类 BaseClass
:
@SuperBuilder
@Data
public class UserWithName extends BaseClass {
private String name;
}
以及:
@SuperBuilder
@Data
public class UserWithNumber extends BaseClass {
private int number;
}
之后,我尝试创建一些 BaseBuilder
:
public BaseClass.BaseClassBuilder generateBaseBuilder() {
return BaseClass.builder()
.userID("1")
.clientID("1");
}
我想在尝试为类创建对象时使用基本生成器 UserWithName
及 UserWithNumber
. 我试着这样做:
public UserWithName generateUserWithName(String name) {
UserWithName.UserWithNameBuilder builder = (UserWithName.UserWithNameBuilder) generateBaseBuilder();
return builder
.name(name)
.build();
}
但它不起作用( ClassCastException
). 以下是完整的代码:
public class Main {
@SuperBuilder
@Data
public static class BaseClass {
private String userID;
private String clientID;
}
@SuperBuilder
@Data
public static class UserWithName extends BaseClass {
private String name;
}
@SuperBuilder
@Data
public static class UserWithNumber extends BaseClass {
private int number;
}
public BaseClass.BaseClassBuilder generateBaseBuilder() {
return BaseClass.builder()
.userID("1")
.clientID("1");
}
public UserWithName generateUserWithName(String name) {
UserWithName.UserWithNameBuilder builder = (UserWithName.UserWithNameBuilder) generateBaseBuilder();
return builder
.name(name)
.build();
}
}
有什么方法可以让我使用我的方法吗 generateBaseBuilder()
用于创建我的对象?
1条答案
按热度按时间b1payxdu1#
您不能强制转换的示例
BaseClassBuilder
到UserWithNameBuilder
,因为继承关系的方向相反,因为它反映了注解类之间的关系:UserWithNameBuilder extends BaseClassBuilder
喜欢UserWithName extends BaseClass
.因此,没有办法打电话给
builder()
要构建的类的方法。话虽如此,我想你的主要目的
generateBaseBuilder()
方法不是创建生成器,而是为新示例设置一些默认值。有两种方法可以实现这一点:将默认值(作为字段初始值设定项)添加到字段并放置
@Builder.Default
在他们身上。重写你的
generateBaseBuilder
成为的方法setDefaultValues
将生成器示例作为参数并仅设置这些值:我更喜欢第一个选项,因为它更简洁。但是,第二个选项更灵活,因为您可以有多个setvalues方法,每个方法都可以设置不同的值。
请注意,您也可以将此/这些方法直接包含到
BaseClassBuilder
. 在stackoverflow这里有一些关于定制的问题和答案@SuperBuilder
.