Widziałem różne pytania na ten temat, ale nadal uważam ten temat za bardzo niezrozumiały.Zderzenie nazwy Java Generics, metoda niepoprawnie przesłonięta
Wszystko, co chcę zrobić, to klasa abstrakcyjna, która implementuje interfejs, i ma klasę rozszerzającą tę klasę abstrakcyjną, aby klasa twarda wymagała implementacji getKommune()
i setKommune(Kommune kommune)
, ale nie drugiej metody, ponieważ jest to Klasa abstrakcyjna.
Mam następujący interfejs.
public interface KommuneFilter {
<E extends AbstractKommune<?>> void addKommuneFromCurrentUser(E e);
Kommune getKommune();
void setKommune(Kommune kommune);
}
I Klasa abstrakcyjna
public abstract class AbstractKommune<E extends AbstractKommune<?>> implements KommuneFilter {
@PrePersist
void addKommuneFromCurrentUser(E e) {
Kommune k = e.getKommune();
}
}
I chcę go używać jak to
public class Person extends AbstractKommune<Person> {
private Kommune kommune;
public void setKommune(Kommune kommune) {this.kommune=kommune;}
public Kommune getKommune() {return kommune;}
}
Jednak uzyskać
Name clash: The method of has the same erasure of type but does not override it
Dlaczego nie jest on prawidłowo przesłonięte?
UPDATE
Dzięki @Bozho, rozwiązanie to:
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>
Dziękuję, to wydawało się działać. Być może jednak mógłbyś mi pomóc zrozumieć, dlaczego to rozwiązanie działa, a nie moje. –
@Shervin: ponieważ w oryginalnym projekcie metoda określona przez interfejs jest metodą ogólną, a próba klasy abstrakcyjnej "@ Override" to nie jest jedna. – polygenelubricants