接口模糊地继承了字段

ben*_*enz 12 java

我正在通过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;
}
Run Code Online (Sandbox Code Playgroud)

它允许继承模糊字段.但是当我尝试引用该字段并访问它时,它会产生编译时错误.为ambigious字段提供编译时错误.我的问题是,第一点为什么编译器在继承了这个野蛮的领域时没有抱怨.为什么在访问时,它给出了这个问题?如果我们在使用类时也这样做,它允许.为什么不在接口的情况下.我的观点是它不应该只在第一时刻允许.澄清这个概念将非常有帮助.

JB *_*zet 9

接口字段是隐含的最终静态.静态字段永远不会被继承.您可以通过定义具有相同名称的新字段来隐藏字段,但您只需要使用适当的接口限定字段名称以解决冲突:

PrintColors.YELLOW
Run Code Online (Sandbox Code Playgroud)

要么

RainbowCOlors.YELLOW
Run Code Online (Sandbox Code Playgroud)

编辑:

澄清(希望):

编译器允许您LotsOfColors.MAGENTA在源代码中使用,尽管该字段实际上已在其中定义PrintColors.MAGENTA.但这只是为了让您的生活更轻松,尤其是当您从子类中的超类引用字段时.

在字节码,虽然,编译器代替了参考LotsOfColors.MAGENTA通过向参考PrintColors.MAGENTA.这一切都发生在编译时,而不是在运行时,就像多态方法一样.

当你有歧义(比如for LotsOfColors.YELLOW)时,编译器无法决定你真正想要使用哪个字段.它可以是PrintColors.YELLOWRainbowColors.YELLOW.因此,编译器不会做出任意决定,而是会产生编译错误,迫使您解决歧义.而你通过提供实际的类名称,可以解决在源代码中的歧义PrintColors.YELLOWRainbowColors.YELLOW.


Jig*_*shi 7

默认情况下,接口中的字段public static final不会被继承