以下代码未编译,并在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 "";
}
}
现在,我的查询Object
和String
都是covariant
而class C
是抽象类,那么为什么会出现此编译错误,尽管我正在实现{{1} }和A
接口方法。
答案 0 :(得分:1)
array
不起作用。
因为如果Set
是Set
,那么我希望从C
返回C
。因此B
可以作为String
,但反之亦然。所以m1
不起作用。
B
我们看到A
从C
返回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