簡體   English   中英

Java - 使用相同的方法和不同的返回類型實現多個接口

[英]Java - implementing multiple interfaces with same method and different return types

請考慮以下代碼:

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接口成員

接口的成員是:

  • 那些成員在界面中聲明。
  • 這些成員繼承自直接超級接口
  • 如果接口沒有直接的超級接口,[...]

因此,如果接口聲明具有相同簽名和不同返回類型或不兼容throws子句的方法 ,則它是編譯時錯誤。

此外, 目前的規范說明如下:

9.4.2超載

如果接口的兩個方法(無論是在同一個接口中聲明,還是由接口繼承,或者聲明的和繼承的)都具有相同的名稱但不同的簽名不等於覆蓋(第8.4.2節),那么方法名稱被稱為重載。 這個事實沒有任何困難,從來沒有導致編譯時錯誤。 返回類型之間或兩個方法的throws子句之間沒有必需的關系,這兩個方法具有相同的名稱但不同的簽名不是覆蓋等效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM