【问题标题】:Covariant return type & throws declaration协变返回类型和抛出声明
【发布时间】: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 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.

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

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

【问题讨论】:

标签: java javac throws covariant-return-types


【解决方案1】:

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

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

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

【讨论】:

  • 如果您不确定问题是什么,请查看查询编辑
  • @overexchange 你应该澄清你的问题而不是批评这个答案。
【解决方案2】:

代码被编译是因为 Java 允许 covarient return type:

以下是代码的 UML 图:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2016-05-11
    • 2017-02-28
    相关资源
    最近更新 更多