繁体   English   中英

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

[英]Failed to open implementation for method added to interface from base class in Eclipse

我正在使用Eclipse Neon。

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

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

我为GeneralServiceImpl创建了一个接口GeneralService ,并添加了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();
}

这可以工作但是在eclipse中点击doB()方法( doC()工作)在MyService Open Implementation中( Ctrl +鼠标左键单击)我找不到任何可用的实现(见下文)

这是Eclipse的bug吗? 我的设置错误地构建了吗? 我的期望错了吗?

  • 来自GeneralService注意事项我可以为其doB()方法打开实现

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

请看它不是一个bug。

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

在此输入图像描述

很显然,在GeneralServiceImpl类覆盖doB()实现接口的功能GeneralService以及MyServiceImpl实现doC()的实现接口的功能MyService

此外, MyServiceImplGeneralServiceImpl之间存在继承关系 - > MyServiceImpl扩展了GeneralServiceImpl ,因此MyServiceImpl具有doB(){}

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

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

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

相反,图中的虚线表示runtime关系,因此实现void doB(); 功能。


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

对于Interface实现class应该覆盖所有声明的函数(除非是abstract )。 作为IDE Eclipse当从Interface搜索函数的实现时,它只查找实现类中的直接实现。 (就像doC()一样)。 [静态视图/编译器]

现在,想象一下MyServiceImplGeneralServiceImpl之间我们有另一个类SubGeneralServiceImpl ,它也会overrides doB() as

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

现在MyServiceImpl扩展了SubGeneralServiceImplSubGeneralServiceImpl进一步扩展了GeneralServiceImpl

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

在此输入图像描述

因此,在静态视图(编译器)中,只要MyServiceImpl重写doB()doC() ),就绝对doC() ......但Eclipse作为IDE不确定将在运行时使用哪个实现,因此无法尝试从MyService接口获取时,为您提供doB()的实现。

希望这可以帮助。

这个对我有用。

测试:

适用于企业Java开发人员的Eclipse IDE。

版本:2019-03(4.11.0)Build id:20190314-1200

我还在一个全新的安装上测试了它(没有默认的插件),它也有效。

还在OSX和Linux上测试过(没有Windows可用...对不起)

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

在以下示例中,注释FooImpl@Override导致编译时错误。 根据Java语言规范9.6.4.4。 这意味着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代理进行检测(例如用于模拟对象)或通过声明性框架。

  1. 当你这样做

ctrl +鼠标悬停

,eclipse为您提供2个选项:

一种。 公开声明。

开放实施。

您需要选择第二个选项。

  1. 我更愿意使用

'ctrl + T'

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

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM