Java 无法打开从Eclipse基类添加到接口的方法的实现
我用的是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
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
methoddoB()
这是可行的,但在eclipse中,当我在MyService Open实现(Ctrl+鼠标左键单击)中单击doB()
方法(doC()
works)时,我找不到任何可用的实现(见下文)
是Eclipse bug吗?我的设置是否构造错误?我的期望错了吗
- 注意:从
中,我可以打开其GeneralService
doB()方法的实现
- 请注意,我需要它的另一个原因也是向现有方法添加Spring服务支持
希望有帮助。
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
不知道它的运行时
实现,因此不会突出显示相同的实现
相反,图中的虚线表示运行时关系,从而表示voiddoB();
函数的实现
根据@howlger评论添加更多信息: 对于
接口
实现类
应该覆盖所有声明的函数(除非抽象
),而作为IDEEclipse
从接口
搜索函数实现时,它只在实现类中寻找直接实现。(如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
界面获取时
希望这能有所帮助。你在哪行代码中发布了哪个单词,你是在用鼠标点击吗?@AbradoD()
在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() {
//
}
}