-1

在下面的层次结构中,

在此处输入图像描述

下面是这个问题的编译代码:

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 I4interface 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

关于协变返回类型抛出声明方面,

我可以说,代码编译成功是因为上面两条规则有效且必要吗?

4

2 回答 2

0

代码被编译是因为 Java 允许协变返回类型

以下是您的代码的 UML 图:

I4接口有 3 种方法m(),但它们的返回类型不同。 I5接口有4个方法m(),它们的返回类型也不同。

类层次结构 I4 I5

于 2018-04-04T15:51:56.157 回答
0

是的,您可以说代码编译正确,因为这些规则是有效且必要的。

如果 T5 没有扩展 T1、T2 和 T3,则 I4 和 I5 将无法编译。

如果 E5 没有扩展 E1、E2 和 E3,那么 I5 将无法编译(I4 将继续编译,因为理论上 I4 的实现者可以创建自己的扩展 E1、E2 和 E3 的异常类)。

于 2015-07-29T06:08:46.730 回答