在下面的层次结构中,
下面是这个问题的编译代码:
class T3 {}
class T2 extends T3{}
class T1 extends T2{}
class T5 extends T1{}
class E3 extends Throwable {}
class E2 extends E3 {}
class E1 extends E2 {}
class E5 extends E1 {}
interface I1{
T1 m() throws E1;
}
interface I2{
T2 m() throws E2;
}
interface I3{
T3 m() throws E3;
}
interface I4 extends I1, I2, I3{
}
interface I5 extends I1, I2, I3{
T5 m() throws E5;
}
在上面的代码中,interface I4
并interface I5
得到编译,因为,
1)
interface I4 extends I1, I2, I3
只有当,
T1 extends T2
&& T1 extends T3
_T2 extends T3
和
E1 extends E2
& E1 extends E3
& E2 extends E3
。
2)
interface I5 extends I1, I2, I3
并仅在以下情况下覆盖m()
,T5 m() throws E5;
T5 extends T1
&& T5 extends T2
_T5 extends T3
和
E5 extends E1
& E5 extends E2
& E5 extends E3
。
关于协变返回类型和抛出声明方面,
我可以说,代码编译成功是因为上面两条规则有效且必要吗?