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

Java 无法打开从Eclipse基类添加到接口的方法的实现,java,eclipse,interface,abstract-class,Java,Eclipse,Interface,Abstract Class,我用的是Eclipse霓虹灯 基本上,我正在创建一个新接口,并向其中添加一个在不同基类中找到的现有方法 我有一个类MyServiceImpl,它用抽象方法doB扩展了基类GeneralServiceImpl 我为GeneralServiceImpl创建了一个接口GeneralService,还添加了doB方法: public interface GeneralService { abstract void doB(); } public class GeneralService

我用的是Eclipse霓虹灯

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

我有一个类
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
method
doB()

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

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

  • 注意:从
    GeneralService
    中,我可以打开其
    doB()方法的实现

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

这对我很有效

测试日期:

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

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

我还测试了一个新的安装(没有插件,除了默认的),它也工作

也在OSX和Linux上测试(没有可用的Windows…抱歉)

  • 当你这样做的时候
  • ctrl+鼠标悬停

    ,eclipse为您提供了两个选项:

    a。公开声明

    b。开放实现

    您需要选择第二个选项

  • 我宁愿使用
  • “ctrl+T”

    查看完整的实现层次结构


    希望有帮助。

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

    在下面的示例中,使用
    @Override
    注释
    FooImpl
    会导致编译时错误。根据定义,这意味着
    FooImpl.foo()
    不实现或定义
    API.foo()

    class MyClass扩展了FooImpl实现API{
    
    @覆盖//请参见它不是一个bug。

    让我们理解(为了更好地理解,我制作了图形表示):

    很明显,
    GeneralServiceImpl
    类覆盖了实现接口
    GeneralService
    doB()
    函数,以及
    myservicecimpl
    实现其实现接口
    doC()
    函数

    另外,
    MyServiceImpl
    GeneralServiceImpl
    -->
    MyServiceImpl
    扩展了
    GeneralServiceImpl
    ,因此
    MyServiceImpl
    具有
    doB(){}

    现在我们必须了解,IDE、completion和compiler使用静态视图。

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

    因此,如果我们看到类和接口的设计方式,
    MyService
    GeneralServiceImpl
    之间没有直接关系,因此
    eclipse
    不知道它的
    运行时
    实现,因此不会突出显示相同的实现

    相反,图中的虚线表示运行时关系,从而表示void
    doB();
    函数的实现


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

    对于
    接口
    实现
    应该覆盖所有声明的函数(除非
    抽象
    ),而作为IDE
    Eclipse
    接口
    搜索函数实现时,它只在实现类中寻找直接实现。(如
    doC()
    它可以工作)。[静态视图/编译器]

    现在,想象一下在
    MyServiceImpl
    GeneralServiceImpl
    之间,我们有另一个类
    SubGeneralServiceImpl
    ,它也
    覆盖doB()

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

    因此,即使现在MyServiceImpl已经有了doB(),但现在可以访问2个doB()实现,可以看到:

    因此,在静态视图(编译器)中,只要
    MyServiceImpl
    覆盖
    doB()
    &
    doC()
    ,它是绝对正确的。但是,作为IDE的Eclipse不确定在运行时使用哪个实现,因此无法为您提供
    doB()的实现
    尝试从
    MyService
    界面获取时


    希望这能有所帮助。

    你在哪行代码中发布了哪个单词,你是在用鼠标点击吗?@Abra
    doD()
    MyService
    中。在Windows 7和Java 8上使用Eclipse Oxygen更新了我的问题解决方案。@Abra我使用的是Eclipse NeonI,我使用的是Eclipse NeonI,在:Eclipse Java EE IDE中为Web开发人员测试过同样的内容。版本:Neon.3发行版(4.6.3)内部版本id:20170314-1500它在Linux和Mac上都能工作。与以前的代码相同,结果相同。@user7294900 Eclipse Neon(4.6)已过时,多年未维护。请升级到Eclipse 2019-03(4.11)@howlger我用一个经过验证的示例更新了我的答案我选择了第二个选项,但它没有找到实现IDN它没有在下拉列表中显示MyServiceImpl吗?这真的很奇怪,因为自从我开始java编程以来,我一直在使用这些快捷方式。你能确定你在java perspe中吗
    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() {}
    }
    
    public class SubGeneralServiceImpl extends GeneralServiceImpl {
        public void doB() {
                //
            }
        }