2013-07-02 41 views
3

我知道並完全同意通過接口共享常量被認爲是bad practice,但我沒有選擇這種實現。不管:該字段不明確,但明顯隱藏

interface SuperClassConstants { 
    public static final String CONSTANT = "super"; 
} 

interface SubClassConstants extends SuperClassConstants { 
    public static final String CONSTANT = "sub"; 
} 

class SuperClass implements SuperClassConstants { 
} 

class SubClass extends SuperClass implements SubClassConstants { 
    public SubClass() { 
     System.out.println(CONSTANT); 
     // The field CONSTANT is ambiguous 
    } 
} 

爲什麼曖昧?是不是常隱藏?我認爲Java的會理解我期待"sub" ...

+0

但是你的'SubClass'類可以訪問這兩個接口...... –

回答

3

由於每JLS 9.3

如果具有相同名稱的兩個字段由接口繼承,因爲,例如,它的兩個直接超級的用該名稱聲明字段,然後得到單個不明確的成員。任何使用這個不明確的成員都會導致編譯時錯誤。

領域CONSTANTSubClassConstants已隱藏的SuperClassConstantsCONSTANT。但類​​可以訪問CONSTANT,因爲它幾乎實現了兩個接口。

可以通過指定的接口名稱消除不確定性:

System.out.println(SubClassConstants.CONSTANT); 

還可以閱讀JLS 6.5.6.1

如果表達式名稱由一個單一的標識符,那麼就必須只有一個聲明,表示要麼是一個局部變量,參數,或在標識符出現的地方可見的字段(第6.4.1節)。否則,會發生編譯時錯誤。