簡體   English   中英

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 voidR 2 void

  • 如果R 1是基元類型,則R 2R 1相同。

  • 如果R 1是引用類型,則以下之一為真:

    • 適合於d 2的類型參數的R 1R 2的子類型。

    • 通過未經檢查的轉換,可以將R 1轉換為R 2的子類型。

    • d 1d 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.

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