在以下层次结构中,
以下是针对此问题的已编译代码:
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
。
关于协变返回类型& 抛出声明方面,
我可以这么说,代码编译成功,因为上面两条规则是有效且必要的吗?
答案 0 :(得分:0)
是的,您可以说代码编译正确,因为这些规则是有效且必要的。
如果T5没有延长T1,T2和T3,那么I4和I5将无法编译。
如果E5没有扩展E1,E2和E3,那么I5将无法编译(I4将继续编译,因为理论上I4的实现者可以创建自己的异常类,扩展E1,E2和E3)。 p>
答案 1 :(得分:0)
代码被编译,因为Java允许covarient return type:
这种称为协变返回类型的技术意味着允许返回类型在与子类相同的方向上变化。
以下是代码的UML图:
I4
接口有3个方法m()
,但它们的返回类型不同。
I5
接口有4个方法m()
,它们的返回类型也不同。