我正在使用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支持
答案 0 :(得分:3)
请参见这不是错误。
让我们理解(为了更好地理解,我进行了图片表达):
很明显,GeneralServiceImpl
类将覆盖实现接口doB()
的{{1}}函数,并且GeneralService
对其实现接口{{ 1}}。
此外,MyServiceImpl
和doC()
之间存在继承关系-> MyService
扩展了MyServiceImpl
,因此GeneralServiceImpl
具有MyServiceImpl
。 / p>
现在我们必须在这里了解 IDE,完成和编译器使用静态视图。
如果您想了解运行时视图,则必须使用调试模式。
因此,如果我们看到类和接口的设计方式,则GeneralServiceImpl
和MyServiceImpl
之间没有直接关系,因此doB(){}
并不知道其MyService
实施,因此并没有强调相同之处。
该图中的虚线表示GeneralServiceImpl
关系,因此实现了无效eclipse
函数。
根据@howlger 评论添加更多信息:
对于实现runtime
的{{1}},应覆盖所有声明的函数(除非runtime
)。并且从doB();
中搜索功能的实现时,作为IDE Interface
,则它仅在实现类中寻找直接实现。 (就像class
一样有效)。 [静态视图/编译器]
现在,假设在abstract
和Eclipse
之间,我们还有另一个类Interface
,该类也doC()
为
MyServiceImpl
,现在GeneralServiceImpl
扩展了SubGeneralServiceImpl
,overrides doB()
进一步扩展了public class SubGeneralServiceImpl extends GeneralServiceImpl {
public void doB() {
//
}
}
。
所以,即使现在MyServiceImpl
具有doB(),但现在可以访问2个doB()实现,可以看到:
因此,在静态视图(编译器)中,只要SubGeneralServiceImpl
覆盖SubGeneralServiceImpl
和GeneralServiceImpl
就可以了……但是,作为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)
Ctrl +鼠标悬停
,eclipse给您2个选择:
a。打开声明。
b。开放实施。
您需要选择第二个选项。
'ctrl + T'
查看完整的实现层次结构。
希望有帮助。