BaseFoo nie może być dziedziczone z różnymi argumentami: <T, X.Bar <T>> i <T, X.Foo <T>>
To jest uproszczona wersjaJava dziedziczyła typ powrotu metody Fluent w wielu hierarchiach poziomów.
Podany następujący kod:
public enum X {
;
static interface BaseFoo<T, S extends BaseFoo<T, S>> {
S foo();
}
static interface Foo<T> extends BaseFoo<T, Foo<T>> {
void foo1();
}
static interface BaseBar<T, S extends BaseBar<T, S>> extends BaseFoo<T, S> {
S bar();
}
static interface Bar<T> extends BaseBar<T, Bar<T>>, Foo<T> {
void bar1();
}
}
biegaćjavac X.java
Otrzymuję komunikat o błędzie:
X.java:15: error: BaseFoo cannot be inherited with different arguments: <T,X.Bar<T>> and <T,X.Foo<T>>
static interface Bar<T> extends BaseBar<T, Bar<T>>, Foo<T> {
^
Każdy ma jakieś rozwiązanie?
Zrzec się: Próbuję użyć wzorca do implementacjipłynny interfejs w hierarchii dziedziczenia klasy kontenera.
tło: aby ułatwić ludziom zrozumienie, dlaczego tego potrzebuję, oto historia. Chcę utworzyć rodzinę kontenerów:Traversal
<-Sequence
<-List
. WięcTraversal
ma metodęTraveral<T> accept(Visitor<T>)
(NiePECS w skrócie), ta metoda powinna zawsze powracaćthis
po iteracji gościa przez elementy. Kiedy mamList
typ, chcę wrócić do metodyList<T>
zamiastTraversal<T>
ponieważ chcę umożliwić coś takiegomyList.accept(v).head(15)
, gdziehead(int)
jest metodąList
nieTraversal