@builder lombok-继承

eni9jsuy  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(279)

我尝试对具有注解的类使用继承 @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");
}

我想在尝试为类创建对象时使用基本生成器 UserWithNameUserWithNumber . 我试着这样做:

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() 用于创建我的对象?

b1payxdu

b1payxdu1#

您不能强制转换的示例 BaseClassBuilderUserWithNameBuilder ,因为继承关系的方向相反,因为它反映了注解类之间的关系: UserWithNameBuilder extends BaseClassBuilder 喜欢 UserWithName extends BaseClass .
因此,没有办法打电话给 builder() 要构建的类的方法。
话虽如此,我想你的主要目的 generateBaseBuilder() 方法不是创建生成器,而是为新示例设置一些默认值。有两种方法可以实现这一点:
将默认值(作为字段初始值设定项)添加到字段并放置 @Builder.Default 在他们身上。
重写你的 generateBaseBuilder 成为的方法 setDefaultValues 将生成器示例作为参数并仅设置这些值:

public static <T extends BaseClass.BaseClassBuilder<?, ?>> T setDefaultValues(T builder) {
    builder
        .userID("1")
        .clientID("1");
    return builder;
}

public static UserWithName generateUserWithName(String name) {
    UserWithNameBuilder<?,?> builder = setDefaultValues(UserWithName.builder());
    return builder            
        .name(name)
        .build();
}

我更喜欢第一个选项,因为它更简洁。但是,第二个选项更灵活,因为您可以有多个setvalues方法,每个方法都可以设置不同的值。
请注意,您也可以将此/这些方法直接包含到 BaseClassBuilder . 在stackoverflow这里有一些关于定制的问题和答案 @SuperBuilder .

相关问题