Lombok @SuperBuilder 在具有通用原因错误的抽象类上:不兼容的类型

问题描述 投票:0回答:2

我有具有泛型类型的抽象类。它具有抽象的 toBuilder 方法,如下所示:在抽象类上使用带有 toBuilder 的 Lombok @SuperBuilder 注释?

这是抽象类:

@Data
@SuperBuilder(toBuilder = true)
public abstract class TenantConfItem<T extends DeepCloneable<T>> {

    private final URN urn;

    private final Long version;

    private final T configData;

    public abstract TenantConfItemBuilder<T, ?, ?> toBuilder();

    public TenantConfItem<T> copy() {
        return this.toBuilder().build();
    }
}

亚型:

@SuperBuilder(toBuilder = true)
@EqualsAndHashCode(callSuper = true)
public class PointsExpirationByEarnedDatePolicy extends TenantConfItem<ExpirationByEarnedDate> implements Singleton {

}

这里我使用它的构建器:

val policyBuilder = PointsExpirationByEarnedDatePolicy.builder()
                .version(0L)
                .configData(new ExpirationByEarnedDate(retentionDays));

但我收到 configData 错误:

error: incompatible types: CAP#1 cannot be converted to ?
                .configData(new ExpirationByEarnedDate(retentionDays));
                           ^
  where CAP#1,CAP#2 are fresh type-variables:
    CAP#1 extends PointsExpirationByEarnedDatePolicyBuilder<CAP#2,CAP#1> from capture of ?
    CAP#2 extends PointsExpirationByEarnedDatePolicy from capture of ?

我猜这是因为父构建器有 3 个通用参数 (

TenantConfItemBuilder<T, ?, ?>
),而子构建器有 2 个 (
PointsExpirationByEarnedDatePolicyBuilder<?, ?>
)。 有解决方法的想法吗?

java lombok
2个回答
4
投票

@SuperBuilder(toBuilder=true)
支持泛型类并从子类中的超类中细化类型参数。所以你的类和它们的注释都很好。

但是,lombok 有时在推断

val
的正确类型时会遇到问题,特别是在涉及类型参数时。

解决方案是将

val
替换为实际类型
PointsExpirationByEarnedDatePolicyBuilder<?, ?>


0
投票

作为上述解决方法的补充说明,如果您检查声明超级构建器时生成的构建器的字节码,您将看到它使用通配符,因此您需要显式声明类型。

UserClass

ByteCode

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.