簡體   English   中英

接口模糊地繼承了字段

[英]Interface ambiguously inherited fields

我正在通過JLS第9.3.1節,我遇到了一個有趣的繼承領域的概念。 這是JLS的示例

interface BaseColors {
int RED = 1, GREEN = 2, BLUE = 4;
}
interface RainbowColors extends BaseColors {
int YELLOW = 3, ORANGE = 5, INDIGO = 6, VIOLET = 7;
}
interface PrintColors extends BaseColors {
int YELLOW = 8, CYAN = 16, MAGENTA = 32;
}
interface LotsOfColors extends RainbowColors, PrintColors {
int FUCHSIA = 17, VERMILION = 43, CHARTREUSE = RED+90;
}

它允許繼承模糊字段。 但是當我嘗試引用該字段並訪問它時,它會產生編譯時錯誤。 為ambigious字段提供編譯時錯誤。 我的問題是,第一點為什么編譯器在繼承了這個野蠻的領域時沒有抱怨。 為什么在訪問時,它會給出這個問題? 如果我們在使用類時也這樣做,它允許。 為什么不在接口的情況下。 我的觀點是它不應該只在第一時刻允許。 澄清這個概念將非常有幫助。

接口字段是隱含的最終靜態。 靜態字段永遠不會被繼承。 您可以通過定義具有相同名稱的新字段來隱藏字段,但您只需要使用適當的接口限定字段名稱以解決沖突:

PrintColors.YELLOW

要么

RainbowCOlors.YELLOW

編輯:

澄清(希望):

編譯器允許您在源代碼中使用LotsOfColors.MAGENTA ,盡管該字段實際上是在PrintColors.MAGENTA定義的。 但這只是為了讓您的生活更輕松,尤其是當您從子類中的超類引用字段時。

在字節碼,雖然,編譯器代替了參考LotsOfColors.MAGENTA通過向參考PrintColors.MAGENTA 這一切都發生在編譯時,而不是在運行時,就像多態方法一樣。

當你有歧義時(比如LotsOfColors.YELLOW ),編譯器無法決定你真正想要使用哪個字段。 它可以是PrintColors.YELLOWRainbowColors.YELLOW 因此,編譯器不會做出任意決定,而是會產生編譯錯誤,迫使您解決歧義。 並且您通過提供實際的類名稱PrintColors.YELLOWRainbowColors.YELLOW解決源代碼中的歧義。

接口中的字段默認為public static final因此它們不會被繼承

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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