Пожалуйста, смотрите это не ошибка.
Давайте разберемся (я сделал изобразительное представление, чтобы лучше понять):

Понятно, что класс GeneralServiceImpl
переопределяет функцию doB()
реализации интерфейса GeneralService
, а также MyServiceImpl
реализует функцию doC()
интерфейса реализации MyService
.
Кроме того, существует отношение наследования между MyServiceImpl
и GeneralServiceImpl
-> MyServiceImpl
extends GeneralServiceImpl
, поэтому MyServiceImpl
имеет doB(){}
.
Теперь мы должны понимать, что IDE, завершение и компилятор используют статическое представление.
Если вы хотите узнать представление во время выполнения, тогда нужно использовать режим отладки.
Итак, если мы увидим, как спроектированы ваши классы и интерфейс, прямой связи между MyService
и GeneralServiceImpl
нет, поэтому eclipse
не знает о своей реализации runtime
и, следовательно, не выделяет то же самое. .
Вместо этого пунктирная линия на диаграмме представляет отношение runtime
и, следовательно, реализацию функции void doB();
.
Добавление дополнительной информации на основе @howlger комментария :
Для Interface
реализация class
должна переопределить все объявленные функции (кроме abstract
). и как IDE Eclipse
при поиске реализации функции из Interface
, тогда она ищет только непосредственную реализацию в реализующих классах. (как для doC()
это работает). [статический вид / компилятор]
Теперь представьте себе, между MyServiceImpl
& GeneralServiceImpl
у нас есть другой класс SubGeneralServiceImpl
, который также overrides doB()
как
public class SubGeneralServiceImpl extends GeneralServiceImpl {
public void doB() {
//
}
}
и теперь MyServiceImpl
расширяется SubGeneralServiceImpl
и SubGeneralServiceImpl
расширяется GeneralServiceImpl
.
Итак, даже сейчас MyServiceImpl
имеет doB () , но теперь имеет доступ к реализации 2 doB () , которую можно увидеть:

, таким образом, в статическом представлении (компилятор) это абсолютно нормально, поскольку MyServiceImpl
переопределяет doB()
& doC()
... однако Eclipse как IDE не уверен, какая реализация будет использоваться, что происходит во время выполнения , таким образом, не может дать вам реализацию doB()
при попытке получить из MyService
Interface.
Надеюсь, это поможет.