接口和协变返回类型

时间:2017-11-12 09:53:02

标签: java inheritance

以下代码未编译,并在Line 1

处发出以下错误
  

返回类型与B.m1()

不兼容
interface A {
    Object m1(); 
}

interface B {
    String m1();
}

abstract class C implements A,B {
    @Override
    public Object m1() //Line 1
    {
        return new Object();
    }
}

class D extends C {

    @Override
    public String m1() {
        return "";
    }

}

现在,我的查询ObjectString都是covariantclass C是抽象类,那么为什么会出现此编译错误,尽管我正在实现{{1} }和A接口方法。

1 个答案:

答案 0 :(得分:1)

array不起作用。

因为如果SetSet,那么我希望从C返回C。因此B可以作为String,但反之亦然。所以m1不起作用。

B

我们看到AC返回final A a = new C(){}; final Object res = a.m1(); //fine, `m1` returns an `Object`. final B b = new C(){}; final String res = b.m1(); //bang ,但您的实现会返回B。编译不允许这种情况发生。

请参阅Liskov substitution principle。如果String m1()那么我到处都有Object我应该能够用C替换它 - 在您的示例中是不是这样的。

这样可行 - 你能明白为什么吗?

B