重写Java中泛型类的方法时不兼容的返回类型

重写Java中泛型类的方法时不兼容的返回类型,java,generics,overriding,Java,Generics,Overriding,我在玩泛型,发现了一个我真的搞不懂的问题。 请查看此代码: 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&

我在玩泛型,发现了一个我真的搞不懂的问题。 请查看此代码:

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;
    }
}
类操作{
}
P类{
}
类MyResource{
}
类MyO扩展操作{
}
类MyP扩展了MyP{
}
抽象A类{
抽象P doIt();
}
B类扩展了A类{
@凌驾
MyP doIt(){
/*
编译器正在抱怨上述行:
返回类型与A.doIt()不兼容
*/
返回null;
}
}
所以基本上,
MyP
p
的一个子类,后者又是
P
。换句话说,我们在
B.doIt
中返回
a.doIt
返回类型的子类。然而,编译器却在抱怨

你能帮我理解这一点吗?
谢谢。

问题在于
MyP
是一个
p
,它与
p
不同(即使它继承了它)。
您需要将抽象方法的返回类型更改为该参数中的协变:

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

抽象P

你声称

P
P
的一个子类是不正确的。这种关系在Java中不成立,原因是泛型类可以协变或逆变方式使用其类型参数(或两者兼有)。如果用法不是严格协变的,则您建议的自动子类型关系将是不可靠的。@SLaks的想法是正确的。

我的推理中确实存在可能重复的问题。谢谢。