在物件導向程式設計領域,類別可以實作多個介面。然而,當這些介面擁有具有相同簽章的方法時,就會出現一個問題:編譯器如何解析哪個介面方法被重寫?
在 Java 中,一個實作多個介面且方法重疊的類別將只有一個有效的實作。編譯器不會根據介面來源來區分方法。
為了理解這個概念,讓我們考慮以下範例:
interface A { int f(); } interface B { int f(); } class Test implements A, B { @Override public int f() { return 0; } }
在這個場景中,Test 同時實現了A 和B ,並且兩個介面都定義了一個具有相同簽名的名為f() 的方法。透過在 Test 中重寫此方法,該類別可以有效地重寫兩個介面中的 f() 方法,即使只存在一個 @Override 註解。
這是因為 Java 的繼承規則規定考慮具有相同簽章的方法「覆寫等效項。」因此,編譯器會選擇它遇到的第一個重寫方法,無論其介面來源為何。
此外,如果衝突的方法具有不同的回傳類型,則可能會出現不相容性。在這種情況下,編譯器會報告錯誤,因為同一個類別中不可能有兩個具有相同簽章但傳回類型不同的方法。
為了說明這一點,讓我們將範例修改如下:
interface Gift { void present(); } interface Guest { boolean present(); } class Presentable implements Gift, Guest { @Override public void present() { System.out.println("Present as a gift!"); } }
這裡,Gift.present() 和Guest.present() 具有不相容的回傳類型(void 與boolean )。因此,Presentable 無法實作這兩個接口,因為它們違反了重寫規則。
總之,當一個類別使用等效重寫方法實作多個介面時,編譯器會辨識出只有一個方法需要實現,並且重寫方法上的 @Override 註解適用於所有介面。然而,方法簽章之間的不相容會導致編譯錯誤。
以上是Java 在多個介面中重寫方法時如何解決歧義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!