![](/img/trans.png)
[英]Java 8 -Two interfaces contain default methods with the same method signature but different return types, how to override?
[英]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和布爾值。 然而,在上面的例子中, AB
的another()
返回類型既是A
又是B
,因此可以實現兩個擴展接口。
此外,看過JLS(8.4.8,8.4.8.3,8.4.8.4)后,我不太明白為什么我的上面的例子非法。 任何人都可以向我解釋這個嗎?
其次,除了重復AB
中A
或B
的合同要求外,還有其他解決方案/解決方法嗎?
對於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.