簡體   English   中英

無法打開從Eclipse中的基類添加到接口的方法的實現

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

此外, MyServiceImplGeneralServiceImpl之間存在繼承關系 - > MyServiceImpl擴展了GeneralServiceImpl ,因此MyServiceImpl具有doB(){}

現在我們必須理解IDE,完成和編譯器使用靜態視圖。

如果你想知道運行時視圖,那么必須使用調試模式。

因此,如果我們看到您的類和接口的設計方式,那么MyServiceGeneralServiceImpl之間沒有直接關系,因此eclipse不知道它的runtime實現,因此不會突出顯示相同的內容。

相反,圖中的虛線表示runtime關系,因此實現void doB(); 功能。


根據@howlger 評論添加更多信息:

對於Interface實現class應該覆蓋所有聲明的函數(除非是abstract )。 作為IDE Eclipse當從Interface搜索函數的實現時,它只查找實現類中的直接實現。 (就像doC()一樣)。 [靜態視圖/編譯器]

現在,想象一下MyServiceImplGeneralServiceImpl之間我們有另一個類SubGeneralServiceImpl ,它也會overrides doB() as

public class SubGeneralServiceImpl extends GeneralServiceImpl {
    public void doB() {
            //
        }
    }

現在MyServiceImpl擴展了SubGeneralServiceImplSubGeneralServiceImpl進一步擴展了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代理進行檢測(例如用於模擬對象)或通過聲明性框架。

  1. 當你這樣做

ctrl +鼠標懸停

,eclipse為您提供2個選項:

一種。 公開聲明。

開放實施。

您需要選擇第二個選項。

  1. 我更願意使用

'ctrl + T'

查看完整的實現層次結構。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM