Java – 使用相同的方法和不同的返回类型实现多个接口

请考虑以下代码:

public interface A { public A another(); } public interface B { public B another(); } public interface AB extends A,B { public AB another(); } 

这导致AB上的编译错误:

B型和A型不兼容; 两者都定义了另一个(),但具有不相关的返回类型

我已经看到了这个问题 ,并在接受的答案中遵循不兼容的例子 – 即

 public interface C { public void doSomething(); } public interface D { public boolean doSomething(); } public interface CD extends C,D { } 

但是,在这种情况下,返回类型实际上是不兼容的 – 返回类型不能同时为void和布尔值。 然而,在上面的示例中, ABanother()返回类型既是A又是B ,因此可以实现两个扩展接口。

此外,看过JLS(8.4.8,8.4.8.3,8.4.8.4),我不太明白为什么我的上面的例子非法。 任何人都可以向我解释这个吗?

其次,除了重复ABAB的合同要求外,还有其他解决方案/解决方法吗?

对于1.5之前版本的Java,会出现此错误消息(至少我可以在Eclipse中将合规性级别设置为1.4时重现该错误)。 换句话说,请确保您正在查看足够旧的规格。

在Java> = 1.5时,以下编译正常。

 interface A { public A another(); } interface B { public B another(); } interface AB extends A,B { public AB another(); } 

如你所说,由于AB既是A又是B ,它满足两个接口。


这是Java语言规范(第二版,即Java 1.4)的引用:

9.2接口成员

接口的成员是:

  • 那些成员在界面中声明。
  • 这些成员inheritance自直接超级接口
  • 如果接口没有直接的超级接口,[…]

因此,如果接口声明具有相同签名和不同返回类型或不兼容throws子句的方法 ,则它是编译时错误。

此外, 目前的规范说明如下:

9.4.2超载

如果接口的两个方法(无论是在同一个接口中声明,还是由接口inheritance,或者声明的和inheritance的一个)具有相同的名称,但不同的签名不是覆盖等效的(§8.4.2),那么方法名称被称为重载。 这个事实没有任何困难,从来没有导致编译时错误。 返回类型之间或两个方法的throws子句之间没有必需的关系,这两个方法具有相同的名称但不同的签名不是覆盖等效的。