BaseFoo kann nicht mit verschiedenen Argumenten vererbt werden: <T, X.Bar <T >> und <T, X.Foo <T >>

Dies ist eine vereinfachte Version vonJava hat den Rückgabetyp der Fluent-Methode in Hierarchien mit mehreren Ebenen geerbt.

Mit folgendem Code:

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();
    }

}

Laufjavac X.java Ich erhalte die Fehlermeldung:

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> {
           ^

Hat jemand eine Lösung?

Ausschluss: Ich versuche, das Muster zu verwenden, um das zu implementierenflüssige Schnittstelle über eine Container-Klassen-Vererbungshierarchie.

Hintergrund: Damit die Leute besser verstehen, warum ich das brauche, hier ist die Geschichte. Ich möchte eine Containerfamilie erstellen:Traversal <-Sequence <-List. SoTraversal hat eine MethodeTraveral<T> accept(Visitor<T>) (NeinPECS kurz) sollte diese Methode immer zurückkehrenthis nach dem iterieren des besuchers durch die elemente. Wenn ich a habeList Typ, ich möchte die Methode zurückgebenList<T> anstattTraversal<T> weil ich es möglich machen will sowas anzurufenmyList.accept(v).head(15), woherhead(int) ist eine Methode vonList nichtTraversal

Antworten auf die Frage(1)

Ihre Antwort auf die Frage