Ответ 1
Поля интерфейса неявно статичны. И статические поля никогда не унаследованы. Вы можете скрыть поле, указав новое поле с тем же именем, но вам просто нужно определить имя поля с соответствующим интерфейсом для разрешения конфликта:
PrintColors.YELLOW
или
RainbowCOlors.YELLOW
EDIT:
Чтобы уточнить (надеюсь):
Компилятор позволяет использовать LotsOfColors.MAGENTA
в исходном коде, хотя поле фактически определено в PrintColors.MAGENTA
. Но это только для того, чтобы сделать вашу жизнь немного легче, особенно когда вы ссылаетесь на поле из суперкласса в подклассе.
В байтовом коде компилятор заменяет ссылку на LotsOfColors.MAGENTA
ссылкой на PrintColors.MAGENTA
. Все это происходит во время компиляции, а не во время выполнения, как для полиморфных методов.
Если у вас двусмысленность (например, для LotsOfColors.YELLOW
), компилятор не может решить, какое из полей вы хотите использовать. Это может быть PrintColors.YELLOW
или RainbowColors.YELLOW
. Таким образом, вместо принятия произвольного решения компилятор создает ошибку компиляции, чтобы заставить вас разрешить двусмысленность. И вы разрешите двусмысленность в исходном коде, указав фактическое имя класса: PrintColors.YELLOW
или RainbowColors.YELLOW
.