Eclipseで基本クラスからインターフェイスに追加する方法のためのオープン実装に失敗しました

user7294900:

私は、Eclipseのネオンを使用しています。

基本的に私は、新しいインターフェイスを作成し、それに異なる基底クラスで見つかった既存のメソッドを追加しています。

私はクラスの持つ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();
}

この作品は、私はをクリックしてください日食にdoB()する方法(doC()MyServiceでオープン実装(中作品)Ctrl私が利用可能な実装を見つけることができません+左マウスクリック)(下記参照します)

これは、Eclipseのバグですか?私の設定が間違って構築されていますか?私の期待間違ってはいるのですか?

  • 注意GeneralService私はそのための実装を開くことができるdoB()方法

  • 私はそれが既存の方法に春のサービスのサポートを追加することでもある必要があるもう一つの理由に注意してください。

ヴィヴェック:

見てください、それはバグではありません。

理解することができます(私はよりよく理解するために絵画的表現を行っています):

ここでは、画像の説明を入力します。

ことは明らかであるGeneralServiceImplクラスのオーバーライドは、doB()インターフェイスを実装する機能GeneralServiceだけでなく、MyServiceImpl実装は、doC()その実装のインターフェイスの機能しますMyService

また、間の継承関係がありMyServiceImplかつGeneralServiceImpl> - MyServiceImpl拡張しGeneralServiceImpl、そうMyServiceImplありdoB(){}

今、私たちはここにいることを理解しなければならないのIDE、完了とコンパイラは、静的なビューを使用します。

あなたはランタイムビューをお知りになりたい場合は、その後1は、デバッグモードを使用する必要があります。

私たちはあなたのクラスやインタフェースが設計された方法を参照のであれば、そこの間には直接的な関係はありませんMyServiceし、GeneralServiceImplそう、eclipseその認識していないruntime実装ので、同じことを強調していません。

むしろ、図中の点線で表されたruntime関係とボイドのこのような実装doB();機能。


@howlgerのに基づいて詳細情報の追加コメントを

以下のためのInterface実装class宣言されたすべての関数をオーバーライドする必要があります(ない限りabstract)。そして、IDEとしてEclipseの機能の実装を検索するときInterface、それはクラスを実装するには唯一の直接実装を探します。(のためのようにdoC()それが動作します)。[静的ビュー/コンパイラ]

さて、間を想像MyServiceImplGeneralServiceImpl私たちは別のクラスを持ってSubGeneralServiceImplいるにもoverrides doB()など

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

そして今MyServiceImpl拡張SubGeneralServiceImplし、SubGeneralServiceImplさらに拡張GeneralServiceImpl

だから、今でもMyServiceImplDOBを()があるが、現在は2 DOB()実装へのアクセス見ることができます:

ここでは、画像の説明を入力します。

したがって、静的ビュー(コンパイラ)で、それは限り、絶対に大丈夫ですMyServiceImplオーバーライドdoB()doC()IDEはあなたの実装与えることができないため、実行時に来るが使用されようとしているどの実装わからないよう...しかしエクリプスdoB()しようとしたときに取得MyServiceインタフェース。

お役に立てれば。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=197561&siteId=1