2

Java ジェネリックに関連する興味深い問題に遭遇しました。「一般化された」定義 (Paginator<Derived>) の代わりに具体的な定義 (DerivedPaginator) を使用したいと思います。そのためには、PaginatorTest で定義されているメソッドを変更する必要があります。いろいろな組み合わせを試しましたが、まだやり方がわかりません。

このパズルを解くのを手伝ってくれませんか?

interface Base {
}

interface Derived extends Base {
}

interface Paginator<T extends Base> {
}

interface DerivedPaginator extends Paginator<Derived> {
}

interface PaginatorTest<T extends Base> {
    // how to define this method so that it would accept DerivedPaginator?
    void check(Paginator<T> it);

    // nice try, but no cigar
    //<Y extends Paginator<T>> void check(Y it);
}

interface DerivedPaginatorTest extends PaginatorTest<Derived> {
    // this works fine
    //@Override
    //void check(Paginator<Derived> it);

    // but this doesn't
    @Override
    void check(DerivedPaginator it);
}
4

2 に答える 2

3

あなたは宣言することができます

interface PaginatorTest<T extends Base, Y extends Paginator<T>> {
    void check(Y it);
}

そしてそれを次のように使用します

interface DerivedPaginatorTest extends PaginatorTest<Derived, DerivedPaginator> {
    @Override
    void check(DerivedPaginator it);
}
于 2012-04-23T16:31:01.537 に答える
2

DerivedPaginatorを拡張Paginator<Derived>しますが、aPaginator<Derived>は必ずしも。ではありませんDerivedPaginatorPaginator<Derived>を実装するが実装しない他のクラスを作成することもできるので、その引数が。DerivedPaginatorであることを保証することはできません。に何も追加しないインターフェースがある理由すらわかりません。とにかく、メソッドに、よりも具体的なものをとらせる必要がある場合は、ハワードが示すように、その何かについても一般化する必要があります。DerivedPaginatorTest .check()DerivedPaginatorDerivedPaginatorPaginator<Derived>check()Paginator<T>

于 2012-04-23T20:13:57.060 に答える