Поскольку X
уже реализует метод f()
, Y
расширяет X
, что делает его наследовать реализацию указанного способа.
Для этого случая разрешение идет под знаком метода. А класс X
, хотя и не реализует интерфейс A, имеет метод с правильной сигнатурой. Таким образом, у этого класса есть Y
.
Я бы сказал, что наличие такой конструкции - в то время как действительной - должно использоваться только тогда, когда не существует способа сделать класс X
также реализованным интерфейсом (внешняя библиотека, замораживание кода, плохой босс и т. Д.), Поскольку он делает некоторые головы царапает о том, что происходит ... один считав код, должен перейти к классу X
и найти f()
метод там ...
Сначала я неправильно понял вопрос, и это было бы справедливо, если X implements A
также присутствует.
Несмотря на то, что вы явно указали пункт X implements A
, это не имеет значения - в этом случае это избыточно.
Если X
был абстрактным, и Y
не реализовали f()
, Y
будет вынужден реализовать метод, если Y
не объявлен абстрактным тоже.
Почему бы и нет? 'Y' наследует метод' f' от 'X' и поднимает его на' public', что разрешено ... – MadProgrammer
Если некоторые методы интерфейса не реализованы в производном классе, но он есть в базовом классе, поэтому он найдет определение из базового класса. – SSP