协变返回类型&抛出声明

时间:2015-07-28 15:05:50

标签: java javac throws covariant-return-types

在以下层次结构中,

enter image description here

以下是针对此问题的已编译代码:

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

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

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

2 个答案:

答案 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(),它们的返回类型也不同。

Class Hierarchy I4 I5