首页 > 解决方案 > 无法打开从 Eclipse 中的基类添加到接口的方法的实现

问题描述

我正在使用 Eclipse Neon。

基本上我正在创建一个新接口并向其添加在不同基类中找到的现有方法。

我有一个用抽象方法MyServiceImpl扩展基类的类。GeneralServiceImpldoB

我创建了一个接口并添加了GeneralService方法:GeneralServiceImpldoB

public interface GeneralService {    
    abstract void doB();
}

public class GeneralServiceImpl implements GeneralService {
   @Override
   public void doB() { }
   }
}
@Service
public class MyServiceImpl extends GeneralServiceImpl implements MyService {
     @Override
     public void doC() { }
}

我的新界面包括期望使用GeneralServiceImpl方法doB()

public interface MyService {
    public void doC();
    public void doB();
}

这可行,但是在 Eclipse 中,当我单击MyService Open Implementation(+ 鼠标左键)中的doB()方法( works)时,我找不到任何可用的实现(见下文)doC()Ctrl

它是 Eclipse 错误吗?我的设置是否构造错误?我的期望错了吗?

标签: javaeclipseinterfaceabstract-class

解决方案


请注意这不是错误。

让我们理解(我已经做了图示以便更好地理解):

在此处输入图像描述

很明显,GeneralServiceImpl该类重写doB()了实现接口GeneralService的功能,也MyServiceImpl实现doC()了它的实现接口的功能MyService

MyServiceImpl此外,和GeneralServiceImpl--> MyServiceImplextends之间存在继承关系GeneralServiceImpl,.MyServiceImpldoB(){}

现在我们必须在这里了解IDE、完成和编译器使用静态视图。

如果您想知道运行时视图,则必须使用调试模式。

因此,如果我们看到您的类和接口的设计方式,则 and 之间没有直接关系MyServiceGeneralServiceImpl因此eclipse不知道其runtime实现,因此不会突出显示相同的内容。

而是图中的虚线表示runtime关系,因此表示 voiddoB();函数的实现。


根据@howlger评论添加更多信息:

对于Interface实现class应该覆盖所有声明的函数(除非abstract)。并且作为 IDEEclipse在搜索函数的实现时,Interface它只在实现类中寻找直接实现。(喜欢doC()它的作品)。[静态视图/编译器]

现在,想象在MyServiceImpl&之间GeneralServiceImpl我们有另一个类,SubGeneralServiceImpl它也是overrides doB()

public class SubGeneralServiceImpl extends GeneralServiceImpl {
    public void doB() {
            //
        }
    }

现在MyServiceImpl延伸SubGeneralServiceImplSubGeneralServiceImpl进一步延伸GeneralServiceImpl

所以,即使现在MyServiceImpl有 doB()但现在可以访问 2 doB() 实现,可以看出:

在此处输入图像描述

因此在静态视图(编译器)中,就MyServiceImpl覆盖doB()和...而言绝对没问题doC()...但是作为 IDE 的 Eclipse 不确定将使用哪个实现在运行时出现,因此无法doB()在尝试时为您提供实现从MyService接口获取。

希望这可以帮助。


推荐阅读