2012-04-23 6 views
2

Javaジェネリックに関する興味深い問題が発生しました。私は "generified"定義(Paginator <Derived>)ではなく、具体的な定義(DerivedPaginator)を使いたいと思います。そのためには、PaginatorTestで定義されているメソッドを変更する必要があります。私はさまざまな組み合わせを試しましたが、私はまだそれを行う方法がわかりません。引数が "generified"クラスを継承するメソッドをオーバーライド

このパズルを解いて私を助けてください。

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

答えて

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); 
} 
+0

はい。これは基本的に回避策です。 –

2

DerivedPaginatorのようにそれを使用することがPaginator<Derived>を拡張しますが、Paginator<Derived>は必ずしもDerivedPaginatorではありません。私はPaginator<Derived>を実装しているが、DerivedPaginatorを実装していない他のクラスを作ることができるので、DerivedPaginatorTest .check()への引数がDerivedPaginatorであることを保証することはできません。私はDerivedPaginatorが何であってもPaginator<Derived>に何も追加しない理由がわからない。とにかく、check()メソッドがPaginator<T>より具体的なものを取ることができるようにする必要がある場合は、Howardが示すように、あまりにもそのことを何かに集約する必要があります。

関連する問題