[英]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.