3

これは、 Java が継承した Fluent メソッドの戻り値の型を複数レベルの階層で簡略化したものです。

次のコードがあるとします。

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

}

実行するjavac X.javaと、次のエラー メッセージが表示されます。

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

誰にも解決策はありますか?

免責事項: パターンを使用して、コンテナー クラスの継承階層全体に流暢なインターフェイスを実装しようとしています。

背景: なぜこれが必要なのかを人々が理解しやすくするために、ここにストーリーがあります。コンテナー ファミリーを作成したい: Traversal<- Sequence<- List. そのTraversalため、メソッドTraveral<T> accept(Visitor<T>)(略してPECSthisはありません) があります。このメソッドは、ビジターが要素を反復処理した後に常に戻る必要があります。型がある場合、代わりにListメソッドを返したいのは、のようなものを呼び出せるようにしたいからです。List<T>Traversal<T>myList.accept(v).head(15)head(int)ListTraversal

4

1 に答える 1