Tengo clase abstracta con tipo genérico. tiene un método toBuilder abstracto como se sugiere aquí: ¿Usar la anotación Lombok @SuperBuilder con toBuilder en una clase abstracta?
@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(); } }el subtipo:
@SuperBuilder(toBuilder = true) @EqualsAndHashCode(callSuper = true) public class PointsExpirationByEarnedDatePolicy extends TenantConfItem<ExpirationByEarnedDate> implements Singleton { }aquí estoy usando su constructor:
val policyBuilder = PointsExpirationByEarnedDatePolicy.builder() .version(0L) .configData(new ExpirationByEarnedDate(retentionDays));pero me sale un error para los 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 ? Supongo que se debe a que el generador principal tiene 3 argumentos con el genérico ( TenantConfItemBuilder<T, ?, ?> ) y el secundario tiene 2 ( PointsExpirationByEarnedDatePolicyBuilder<?, ?> ). ¿Alguna idea para solucionarlo?
@SuperBuilder(toBuilder=true) admite clases genéricas y refina el parámetro de tipo de la superclase en la subclase. Entonces sus clases y sus anotaciones están bien.
Sin embargo, lombok a veces tiene problemas para inferir el tipo correcto de val , especialmente cuando se trata de parámetros de tipo.
La solución es reemplazar val con el tipo real PointsExpirationByEarnedDatePolicyBuilder<?, ?> .