【发布时间】:2015-07-28 15:05:49
【问题描述】:
在下面的层次结构中,
下面是这个问题的编译代码:
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.
关于协变返回类型和抛出声明方面,
我可以说,代码编译成功是因为上面两条规则有效且必要吗?
【问题讨论】:
标签: java javac throws covariant-return-types