重写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的想法是正确的。我的推理中确实存在可能重复的问题。谢谢。