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

questionAnswers(1)

yourAnswerToTheQuestion