Java中的泛型类方法覆盖时返回类型不兼容

5

我在尝试使用泛型时遇到了一个问题,真的无法解决。请看下面的代码:

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> 的子类。换句话说,我们在 B.doIt 返回一个 A.doIt 返回类型的子类。但是,编译器报错了。
你能帮助我理解这个吗? 谢谢。

2个回答

6
问题在于MyP是一个P<MyO,>,而不是一个P<Operation<MyResource>,>(即使它继承了它)。您需要将抽象方法的返回类型在该参数上变为协变:
abstract class A<R> {
    abstract P<? extends Operation<R>, R> doIt();
}

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

2
你的说法,即 P<MyO, MyResource>P<Operation<MyResource>, MyResource> 的子类是不正确的。在 Java 中,这类关系并不存在。原因是泛型类可以以协变或逆变方式(或两者兼而有之)使用其类型参数。如果使用方式除了纯协变之外,你提出的自动子类型关系将不具有健全性。@SLaks 的想法是正确的。

确实,那是我思考中的问题。谢谢。 - randomdev7u81

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接