BaseFoo no se puede heredar con diferentes argumentos: <T, X.Bar <T>> y <T, X.Foo <T>>

Esta es una versión simplificada deTipo de retorno del método Fluent heredado de Java en jerarquías de varios niveles.

Dado el siguiente código:

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

}

correrjavac X.java Me sale el mensaje de error:

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

¿Alguien tiene alguna solución?

Negar: Estoy tratando de usar el patrón para implementar elinterfaz fluida a través de una jerarquía de herencia de clase de contenedor.

Fondo: para hacer que sea más fácil para las personas entender por qué necesito esto, aquí está la historia. Quiero crear una familia de contenedores:Traversal <-Sequence <-List. Asi queTraversal tiene un metodoTraveral<T> accept(Visitor<T>) (noPECS para abreviar), este método siempre debe volver.this Después de iterar al visitante a través de los elementos. Cuando tengo unList tipo, quiero que el método vuelvaList<T> en lugar deTraversal<T> Porque quiero hacer posible llamar algo así.myList.accept(v).head(15), dóndehead(int) es un método deList noTraversal

Respuestas a la pregunta(1)

Su respuesta a la pregunta