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

时间:2012-07-05 11:18:51

标签: java interface override jls

请考虑以下代码:

public interface A {
  public A another();
}

public interface B {
  public B another();
}

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

这导致AB上的编译错误:

  

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

我已经看到了这个SO question,并按照接受的答案中的不兼容性示例 - 即。

public interface C { 
  public void doSomething();
}

public interface D {
  public boolean doSomething();
}

public interface CD extends C,D { 
}

但是,在这种情况下,返回类型真的不兼容 - 返回类型不能同时为void和布尔值。然而,在上面的示例中,another()的{​​{1}}返回类型都是ABA,因此可以实现两个扩展接口。< / p>

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

第二,除了重复BAB的合同要求之外,还有其他解决方案/解决方法吗?

1 个答案:

答案 0 :(得分:11)

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

在Java&gt; = 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接口成员

     

界面的成员是:

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

如果接口声明一个具有相同签名和不同返回类型的方法或不兼容的throws子句,那么这是一个编译时错误。

此外,当前规范说明如下:

  

9.4.2重载

     

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