我当时正在研究泛型,但发现确实无法解决的问题。
请看下面的代码:
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;
}
}
因此,基本上,
MyP
是P<MyO, MyResource>
的子类,而P<Operation<MyResource>, MyResource>
又是A.doIt
的子类B.doIt
。换句话说,我们在ojit_code中返回了ojit_code返回类型的子类。但是,尽管如此,编译器仍在提示。你能帮我理解吗?
谢谢。
最佳答案
问题在于MyP
是P<MyO,>
,它与P<Operation<MyResource>,>
不同(即使它确实继承了它)。
您需要在该参数中将抽象方法的返回类型更改为协变的:
abstract class A<R> {
abstract P<? extends Operation<R>, R> doIt();
}
现在,
MyP
可转换为基本返回类型,因此一切正常。