[英]Multiple Inheritance Ambiguity with Interface
我們都知道有關多重遺傳的鑽石問題 -
A
/ \
B C
\ /
D
這個問題描述了D
類的模糊情況。 如果A
類有一個方法並且B
和/或C
兩個/都覆蓋了該方法,則D
覆蓋哪個版本的方法?
這個問題是否也適用於Java中的接口? 如果沒有,Java接口如何克服這個問題?
菱形問題僅適用於實現繼承(在Java 8之前的所有Java版本中都有extends
)。 它不適用於API繼承(在Java 8之前的所有Java版本中implements
)。
由於具有匹配類型簽名的接口方法是兼容的,因此如果您繼承兩次相同的方法簽名,則不存在菱形問題:匹配方法簽名只是簡單地合並。 (如果類型簽名不一樣,那么你也沒有鑽石問題。)
在Java 7及更低版本中,繼承實現代碼的唯一方法是使用extends
關鍵字,該關鍵字最多只能限制一個父級。 因此,沒有多重實現繼承,並且鑽石問題不存在。
Java 8增加了一個新的皺紋,因為它允許接口具有實現代碼。 當您使用具有匹配簽名的方法實現多個接口時,它仍然可以通過簡單地回退到先前的行為(沒有實現繼承)來逃避鑽石問題。
Java克服了這個問題,即使接口可以有方法的默認實現,因為默認實現是明確的 ( A
類中A
)或者情境是由某些規則解決的 (當B
類或C
類覆蓋A
類的實現時,見下文)。
當類或接口的超類型提供具有相同簽名的多個默認方法時:
但是, 如果兩個或多個獨立定義的默認方法沖突 ,或者默認方法與抽象方法沖突,則Java編譯器會產生編譯器錯誤。 您必須顯式覆蓋超類型方法 。 在這種情況下,您可以使用super關鍵字調用任何默認實現。
使用Java 8中引入的接口中的默認方法,可能會出現多個繼承相關的問題,有3種情況 -
1-如果實現類重寫默認方法並為默認方法提供自己的功能,則類的方法優先於接口默認方法。
2 - 當類實現兩個接口並且兩者都具有相同的默認方法時,類也不會覆蓋該方法,然后將拋出錯誤。
3 - 如果接口擴展另一個接口並且兩者都具有相同的默認方法,則繼承接口缺省方法優先。
在這里閱讀更多相關信息。
Java不支持多重繼承,因此不會出現鑽石問題。 如果B&C是接口,則接口中沒有實現。 即使B&C覆蓋接口A中的方法(不能是類),方法也會有相同的簽名。 關於使用哪種實現沒有歧義,因為沒有實現。
具有虛擬聲明的接口,它們將沒有實現,因此沒有歧義問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.