[英]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
。
此外, MyServiceImpl
和GeneralServiceImpl
之间存在继承关系 - > MyServiceImpl
扩展了GeneralServiceImpl
,因此MyServiceImpl
具有doB(){}
。
现在我们必须理解IDE,完成和编译器使用静态视图。
如果你想知道运行时视图,那么必须使用调试模式。
因此,如果我们看到您的类和接口的设计方式,那么MyService
和GeneralServiceImpl
之间没有直接关系,因此eclipse
不知道它的runtime
实现,因此不会突出显示相同的内容。
相反,图中的虚线表示runtime
关系,因此实现void doB();
功能。
根据@howlger 评论添加更多信息:
对于Interface
实现class
应该覆盖所有声明的函数(除非是abstract
)。 作为IDE Eclipse
当从Interface
搜索函数的实现时,它只查找实现类中的直接实现。 (就像doC()
一样)。 [静态视图/编译器]
现在,想象一下MyServiceImpl
和GeneralServiceImpl
之间我们有另一个类SubGeneralServiceImpl
,它也会overrides doB()
as
public class SubGeneralServiceImpl extends GeneralServiceImpl {
public void doB() {
//
}
}
现在MyServiceImpl
扩展了SubGeneralServiceImpl
, SubGeneralServiceImpl
进一步扩展了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代理进行检测(例如用于模拟对象)或通过声明性框架。
ctrl +鼠标悬停
,eclipse为您提供2个选项:
一种。 公开声明。
湾 开放实施。
您需要选择第二个选项。
'ctrl + T'
查看完整的实现层次结构。
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.