无法打开从 Eclipse 中的基础 class 添加到接口的方法的实现
Failed to open implementation for method added to interface from base class in Eclipse
我正在使用 Eclipse Neon。
基本上我正在创建一个新接口并向其添加在不同基础 class 中找到的现有方法。
我有一个 class MyServiceImpl
扩展基础 class GeneralServiceImpl
抽象方法 doB
.
我为 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 中,当我在 MyService Open Implementation 中单击 doB()
方法(doC()
有效)时(Ctrl + 鼠标左键单击)我找不到任何可用的实现(见下文)
是 Eclipse 的 bug 吗?我的设置是否构造错误?我的期望错了吗?
来自 GeneralService
的注释我可以为其 doB()
方法打开实现
请注意,我需要它的另一个原因也是为现有方法添加 Spring 服务支持
对我有用。
测试于:
面向企业 Java 开发人员的 Eclipse IDE。
版本:2019-03 (4.11.0)
构建 ID:20190314-1200
我还在全新安装上对其进行了测试(除了默认插件外没有其他插件),它也能正常工作。
还在 OSX 和 Linux 上进行了测试(没有 Windows 可用...抱歉)
- 当你
ctrl + mouse hover
, eclipse 给你两个选择:
一个。打开声明。
b。开放实施。
您需要select第二个选项。
- 我更愿意使用
'ctrl + T'
查看完整的实施层次结构。
希望对您有所帮助。
GeneralServiceImpl.doB()
不是 MyService.doB()
的实现,但在 MyServiceImpl
中用于实现 MyService.doB()
。因此,将 GeneralServiceImpl.doB()
显示为 MyService.doB()
.
的实现或定义是错误的
在以下示例中,使用 @Override
注释 FooImpl
会导致编译时错误。根据 Java Language Specification 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 不会显示的非显式 implementation/definition 方法有更多可能性:例如通过 Java 代理(例如用于模拟对象)或通过声明性框架。
请查看这不是错误。
大家理解一下(为了更好理解我做了图示):
很明显GeneralServiceImpl
class重写了实现接口GeneralService
的doB()
函数以及MyServiceImpl
实现了doC()
函数它的实现接口 MyService
.
另外,MyServiceImpl
和GeneralServiceImpl
之间存在继承关系 --> MyServiceImpl
extends GeneralServiceImpl
,所以 MyServiceImpl
有 doB(){}
.
这里我们要明白IDEs,completion和compiler使用的是static view
如果你想知道运行时间视图那么必须使用调试模式。
所以,如果我们看到你的 classes 和界面的设计方式,MyService
和 GeneralServiceImpl
之间没有直接关系,所以 eclipse
不知道它的 runtime
实现,因此不会突出显示相同的内容。
相反,图中的虚线表示 runtime
关系,因此实现了 void doB();
函数。
根据@howlger 添加更多信息评论 :
对于 Interface
实现 class
应该覆盖所有声明的函数(除非 abstract
)。并且作为 IDE Eclipse
从 Interface
中搜索函数的实现时,它仅在实现 classes 中查找直接实现。 (比如 doC()
它有效)。 [静态视图/编译器]
现在,想象一下在 MyServiceImpl
和 GeneralServiceImpl
之间我们有另一个 class SubGeneralServiceImpl
也 overrides doB()
和
public class SubGeneralServiceImpl extends GeneralServiceImpl {
public void doB() {
//
}
}
现在 MyServiceImpl
扩展了 SubGeneralServiceImpl
并且 SubGeneralServiceImpl
进一步扩展了 GeneralServiceImpl
.
所以,即使现在 MyServiceImpl
有 doB() 但现在可以访问 2 doB() 实现,可以看出:
因此在静态视图(编译器)中,只要 MyServiceImpl
覆盖 doB()
和 doC()
就绝对没问题......但是 Eclipse 作为 IDE 不是确保在 运行 时将使用哪个实现,因此在尝试从 MyService
接口获取时无法为您提供 doB()
的实现。
希望对您有所帮助。
我正在使用 Eclipse Neon。
基本上我正在创建一个新接口并向其添加在不同基础 class 中找到的现有方法。
我有一个 class MyServiceImpl
扩展基础 class GeneralServiceImpl
抽象方法 doB
.
我为 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 中,当我在 MyService Open Implementation 中单击 doB()
方法(doC()
有效)时(Ctrl + 鼠标左键单击)我找不到任何可用的实现(见下文)
是 Eclipse 的 bug 吗?我的设置是否构造错误?我的期望错了吗?
来自
GeneralService
的注释我可以为其doB()
方法打开实现请注意,我需要它的另一个原因也是为现有方法添加 Spring 服务支持
对我有用。
测试于:
面向企业 Java 开发人员的 Eclipse IDE。
版本:2019-03 (4.11.0) 构建 ID:20190314-1200
我还在全新安装上对其进行了测试(除了默认插件外没有其他插件),它也能正常工作。
还在 OSX 和 Linux 上进行了测试(没有 Windows 可用...抱歉)
- 当你
ctrl + mouse hover
, eclipse 给你两个选择:
一个。打开声明。
b。开放实施。
您需要select第二个选项。
- 我更愿意使用
'ctrl + T'
查看完整的实施层次结构。
希望对您有所帮助。
GeneralServiceImpl.doB()
不是 MyService.doB()
的实现,但在 MyServiceImpl
中用于实现 MyService.doB()
。因此,将 GeneralServiceImpl.doB()
显示为 MyService.doB()
.
在以下示例中,使用 @Override
注释 FooImpl
会导致编译时错误。根据 Java Language Specification 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 不会显示的非显式 implementation/definition 方法有更多可能性:例如通过 Java 代理(例如用于模拟对象)或通过声明性框架。
请查看这不是错误。
大家理解一下(为了更好理解我做了图示):
很明显GeneralServiceImpl
class重写了实现接口GeneralService
的doB()
函数以及MyServiceImpl
实现了doC()
函数它的实现接口 MyService
.
另外,MyServiceImpl
和GeneralServiceImpl
之间存在继承关系 --> MyServiceImpl
extends GeneralServiceImpl
,所以 MyServiceImpl
有 doB(){}
.
这里我们要明白IDEs,completion和compiler使用的是static view
如果你想知道运行时间视图那么必须使用调试模式。
所以,如果我们看到你的 classes 和界面的设计方式,MyService
和 GeneralServiceImpl
之间没有直接关系,所以 eclipse
不知道它的 runtime
实现,因此不会突出显示相同的内容。
相反,图中的虚线表示 runtime
关系,因此实现了 void doB();
函数。
根据@howlger 添加更多信息评论 :
对于 Interface
实现 class
应该覆盖所有声明的函数(除非 abstract
)。并且作为 IDE Eclipse
从 Interface
中搜索函数的实现时,它仅在实现 classes 中查找直接实现。 (比如 doC()
它有效)。 [静态视图/编译器]
现在,想象一下在 MyServiceImpl
和 GeneralServiceImpl
之间我们有另一个 class SubGeneralServiceImpl
也 overrides doB()
和
public class SubGeneralServiceImpl extends GeneralServiceImpl {
public void doB() {
//
}
}
现在 MyServiceImpl
扩展了 SubGeneralServiceImpl
并且 SubGeneralServiceImpl
进一步扩展了 GeneralServiceImpl
.
所以,即使现在 MyServiceImpl
有 doB() 但现在可以访问 2 doB() 实现,可以看出:
因此在静态视图(编译器)中,只要 MyServiceImpl
覆盖 doB()
和 doC()
就绝对没问题......但是 Eclipse 作为 IDE 不是确保在 运行 时将使用哪个实现,因此在尝试从 MyService
接口获取时无法为您提供 doB()
的实现。
希望对您有所帮助。