He visto diferentes preguntas al respecto, pero todavía encuentro este tema muy confuso.Choque de nombres genéricos de Java, método no correctamente anulado
Todo lo que quiero hacer es tener una clase abstracta que implemente una interfaz y tener una clase que extienda esta clase abstracta para que la clase difícil necesite implementar getKommune()
y setKommune(Kommune kommune)
, pero no el otro método, porque eso está la clase abstracta
Tengo la siguiente interfaz.
public interface KommuneFilter {
<E extends AbstractKommune<?>> void addKommuneFromCurrentUser(E e);
Kommune getKommune();
void setKommune(Kommune kommune);
}
Y esta clase abstracta
public abstract class AbstractKommune<E extends AbstractKommune<?>> implements KommuneFilter {
@PrePersist
void addKommuneFromCurrentUser(E e) {
Kommune k = e.getKommune();
}
}
Y quiero utilizar de esta manera
public class Person extends AbstractKommune<Person> {
private Kommune kommune;
public void setKommune(Kommune kommune) {this.kommune=kommune;}
public Kommune getKommune() {return kommune;}
}
Sin embargo, consigo
Name clash: The method of has the same erasure of type but does not override it
Por qué no está anulado correctamente?
ACTUALIZACIÓN
Gracias a @Bozho, la solución es la siguiente:
public interface KommuneFilter<E extends AbstractKommune<?>> {
public void addKommuneFromCurrentUser(E e);
}
public abstract class AbstractKommune<E extends AbstractKommune<?>> implements KommuneFilter<E>
public class Person extends AbstractKommune<Person>
Gracias, esto pareció funcionar. Sin embargo, tal vez podrías por favor hacerme entender por qué esta solución funcionó y no la mía. –
@Shervin: porque en su diseño original, el método especificado por la interfaz es un método genérico, y el intento de su clase abstracta de '@ Override' no es uno. – polygenelubricants