2

我刚刚遇到了一个与 Java 泛型相关的有趣问题。我想使用具体定义(DerivedPaginator)而不是“通用”定义(Paginator<Derived>)。为此,我必须更改 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

DerivedPaginatorextends Paginator<Derived>,但 aPaginator<Derived>不一定是 a DerivedPaginator。我可以创建其他一些实现Paginator<Derived>但不实现的类DerivedPaginator,因此您不能保证该参数DerivedPaginatorTest .check()DerivedPaginator. 我什至不确定为什么你的界面DerivedPaginator没有添加任何内容Paginator<Derived>。无论如何,如果你需要让check()方法采用比 更具体的东西Paginator<T>,你也需要泛化那些东西,就像霍华德展示的那样。

于 2012-04-23T20:13:57.060 回答