我当时正在研究泛型,但发现确实无法解决的问题。
请看下面的代码:

class Operation<R> {
}

class P<O extends Operation<R>, R> {
}

class MyResource {
}

class MyO extends Operation<MyResource> {
}

class MyP extends P<MyO, MyResource> {
}

abstract class A<R> {
    abstract P<Operation<R>, R> doIt();
}

class B extends A<MyResource> {
    @Override
    MyP doIt() {
    /*
        the compiler is complaining about the above line:
        The return type is incompatible with A<MyResource>.doIt()
    */
        return null;
    }
}

因此,基本上,MyPP<MyO, MyResource>的子类,而P<Operation<MyResource>, MyResource>又是A.doIt的子类B.doIt。换句话说,我们在ojit_code中返回了ojit_code返回类型的子类。但是,尽管如此,编译器仍在提示。

你能帮我理解吗?
谢谢。

最佳答案

问题在于MyPP<MyO,>,它与P<Operation<MyResource>,>不同(即使它确实继承了它)。
您需要在该参数中将抽象方法的返回类型更改为协变的:

abstract class A<R> {
    abstract P<? extends Operation<R>, R> doIt();
}

现在,MyP可转换为基本返回类型,因此一切正常。

09-05 12:10