Ho visto diverse domande a riguardo, ma trovo ancora questo argomento molto confuso.Nome conflitto Java generico, metodo non sovrascritto correttamente
Tutto quello che voglio fare, è di avere una classe astratta che implementa un'interfaccia, e hanno una classe che estende la classe astratta in modo che la classe difficile deve attuare getKommune()
e setKommune(Kommune kommune)
, ma non l'altro metodo, perché è in la classe astratta.
Ho la seguente interfaccia.
public interface KommuneFilter {
<E extends AbstractKommune<?>> void addKommuneFromCurrentUser(E e);
Kommune getKommune();
void setKommune(Kommune kommune);
}
E questa classe astratta
public abstract class AbstractKommune<E extends AbstractKommune<?>> implements KommuneFilter {
@PrePersist
void addKommuneFromCurrentUser(E e) {
Kommune k = e.getKommune();
}
}
E voglio usare in questo modo
public class Person extends AbstractKommune<Person> {
private Kommune kommune;
public void setKommune(Kommune kommune) {this.kommune=kommune;}
public Kommune getKommune() {return kommune;}
}
Tuttavia, ottengo
Name clash: The method of has the same erasure of type but does not override it
perché non è sovrascritto correttamente?
UPDATE
Grazie alla @Bozho, la soluzione è questa:
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>
Grazie, sembra funzionare. Tuttavia, forse potresti farmi capire perché questa soluzione ha funzionato e non il mio. –
@Shervin: poiché nella progettazione originale, il metodo specificato dall'interfaccia è un metodo generico e il tentativo della classe astratta di "@ Sostituire" non è uno. – polygenelubricants