Eclipse-无法打开实现从基类添加到接口的方法的实现

时间:2019-03-28 14:05:14

标签: java eclipse interface abstract-class

我正在使用Eclipse Neon,

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

我有一个类MyServiceImpl,它使用抽象方法GeneralServiceImpl扩展了基类doB

我为GeneralService创建了一个接口GeneralServiceImpl,还添加了doB方法

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();
}

这有效,但是当我在MyService Open Implementation( Ctrl +鼠标左键单击)中单击doB()方法(doC()有效)时,在月食中找不到任何可以实施(见下文)

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

  • 来自GeneralService的注释,我可以为其doB()方法打开实现

  • 请注意,我需要它的另一个原因也是在现有方法中添加Spring Service支持

4 个答案:

答案 0 :(得分:3)

请参见这不是错误。

让我们理解(为了更好地理解,我进行了图片表达):

enter image description here

很明显,GeneralServiceImpl类将覆盖实现接口doB()的{​​{1}}函数,并且GeneralService对其实现接口{{ 1}}。

此外,MyServiceImpldoC()之间存在继承关系-> MyService扩展了MyServiceImpl,因此GeneralServiceImpl具有MyServiceImpl。 / p>

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

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

因此,如果我们看到类和接口的设计方式,则GeneralServiceImplMyServiceImpl之间没有直接关系,因此doB(){}并不知道其MyService实施,因此并没有强调相同之处。

该图中的虚线表示GeneralServiceImpl关系,因此实现了无效eclipse函数。


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

对于实现runtime的{​​{1}},应覆盖所有声明的函数(除非runtime)。并且从doB();中搜索功能的实现时,作为IDE Interface,则它仅在实现类中寻找直接实现。 (就像class一样有效)。 [静态视图/编译器]

现在,假设在abstractEclipse之间,我们还有另一个类Interface,该类也doC()

MyServiceImpl

,现在GeneralServiceImpl扩展了SubGeneralServiceImploverrides doB()进一步扩展了public class SubGeneralServiceImpl extends GeneralServiceImpl { public void doB() { // } }

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

enter image description here

因此,在静态视图(编译器)中,只要SubGeneralServiceImpl覆盖SubGeneralServiceImplGeneralServiceImpl就可以了……但是,作为IDE的Eclipse不确定要实现哪种实现会在运行时使用,因此在尝试从MyServiceImpl接口获取时无法为您提供MyServiceImpl的实现。

希望这会有所帮助。

答案 1 :(得分:2)

对我有用。

经过测试:

面向企业Java开发人员的Eclipse IDE。

版本:2019-03(4.11.0) 版本号:20190314-1200

我还在全新安装上进行了测试(默认插件之外没有其他插件),并且它也可以正常工作。

也在OSX和Linux上进行了测试(没有可用的Windows ...对不起)

答案 2 :(得分:2)

GeneralServiceImpl.doB()不是MyService.doB() 的实现,而是在MyServiceImpl中用于实现MyService.doB()的实现。因此,将GeneralServiceImpl.doB()显示为MyService.doB()的实现或定义是错误的。

在以下示例中,用FooImpl注释@Override会导致编译时错误。根据{{​​3}},这意味着FooImpl.foo()没有实现或定义API.foo()

class MyClass extends FooImpl implements API {
    @Override // <- correct
    public void bar() {};
}

interface API {
    void foo();
    void bar();
}

class FooImpl {
    // @Override <- compile error
    public void foo() {}
}

请注意,非显式实现/定义的方法还有更多的可能性,Eclipse不会显示:例如通过Java代理(例如用于模拟对象)或通过声明性框架进行检测。

答案 3 :(得分:1)

  1. 执行时
  

Ctrl +鼠标悬停

,eclipse给您2个选择:

a。打开声明。

b。开放实施。

您需要选择第二个选项。

  1. 我更愿意使用
  

'ctrl + T'

查看完整的实现层次结构。

希望有帮助。