![](/img/trans.png)
[英]Implementing two interfaces with two default methods of the same signature in Java 8
[英]Java 8 -Two interfaces contain default methods with the same method signature but different return types, how to override?
我理解如果一個類實現包含同名默認方法的多個接口,那么我們需要在子類中重寫該方法,以便明確定義我的方法將執行的操作。
問題是,見下面的代碼:
interface A {
default void print() {
System.out.println(" In interface A ");
}
}
interface B {
default String print() {
return "In interface B";
}
}
public class C implements A, B {
@Override
public String print() {
return "In class C";
}
public static void main(String arg[]) {
// Other funny things
}
}
現在,接口A和B都有一個名為'print'的默認方法,但我想覆蓋接口B的print方法 - 返回字符串並按原樣保留A的打印方式。 但是這段代碼不能編譯給出:
Overrides A.print
The return type is incompatible with A.print()
很明顯,編譯器試圖覆蓋A的打印方法,我不明白為什么!
這是不可能的。
8.4.8.3 :
如果具有返回類型
R 1
的方法聲明d 1
覆蓋或隱藏具有返回類型R 2
的另一方法d 2
的聲明,則d 1
必須是d 2
return-type-substitutable ,否則發生編譯時錯誤。
8.4.5 :
返回類型為
R 1
的方法聲明d 1
是返回類型 - 可替代另一個方法d 2
,返回類型為R 2
iff以下任何一個為真:
如果
R 1
void
則R 2
void
。如果
R 1
是基元類型,則R 2
與R 1
相同。如果
R 1
是引用類型,則以下之一為真:
適合於
d 2
的類型參數的R 1
是R 2
的子類型。通過未經檢查的轉換,可以將
R 1
轉換為R 2
的子類型。
d 1
與d 2
不具有相同的特征,並且R 1 = |R 2 |
。
換句話說, void
,primitive和reference-returns方法可能只會被相同的相應類別的方法覆蓋和覆蓋。 void
方法可能只覆蓋另一個void
方法,引用返回方法可能只覆蓋另一個引用返回方法,依此類推。
您遇到的問題的一種可能解決方案可能是使用組合而不是繼承:
class C {
private A a = ...;
private B b = ...;
public A getA() { return a; }
public B getB() { return b; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.