我有具有泛型类型的抽象类。它具有抽象的 toBuilder 方法,如下所示:在抽象类上使用 Lombok @SuperBuilder 注释和 toBuilder?
@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();
}
}
Run Code Online (Sandbox Code Playgroud)
子类型:
@SuperBuilder(toBuilder = true)
@EqualsAndHashCode(callSuper = true)
public class PointsExpirationByEarnedDatePolicy extends TenantConfItem<ExpirationByEarnedDate> implements Singleton {
}
Run Code Online (Sandbox Code Playgroud)
我在这里使用它的构建器:
val policyBuilder = PointsExpirationByEarnedDatePolicy.builder()
.version(0L)
.configData(new ExpirationByEarnedDate(retentionDays));
Run Code Online (Sandbox Code Playgroud)
但我收到 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 ?
Run Code Online (Sandbox Code Playgroud)
我猜这是因为父构建器有 3 个带有泛型 ( TenantConfItemBuilder<T, ?, ?>) 的参数,而子构建器有 2 个 ( PointsExpirationByEarnedDatePolicyBuilder<?, ?>)。有解决方法的想法吗?
@SuperBuilder(toBuilder=true)支持泛型类并从子类中的超类中细化类型参数。所以你的类和它们的注释都很好。
然而,lombok 有时在推断 的正确类型时会遇到问题val,特别是在涉及类型参数时。
解决办法是更换val为实际类型PointsExpirationByEarnedDatePolicyBuilder<?, ?>。
| 归档时间: |
|
| 查看次数: |
5882 次 |
| 最近记录: |