0

他のインターフェースを拡張するインターフェースがあります。これらのインターフェースの実装が使用されると、私の IDE (Eclipse および IntelliJ のアイデア) は実装クラスを解決できません。これによってコードのコンパイルが妨げられることはありませんが、IDE が非常に不安定であることは非常に独特です。私が誤解している基本的なことはありますか?問題を概説する単純化された構造を提示します。

基本インターフェース

public interface Avoidable {

    public void avoid();

}

ベースのものを拡張するインターフェース

public interface MostlyAvoidable extends Avoidable {

    public void most();

}

実装です

public class MostlyAvoidableImpl implements MostlyAvoidable {
    @Override
    public void most() {}

    @Override
    public void avoid() {}
}

2 番目の拡張インターフェース

public interface SomewhatAvoidable extends Avoidable {

    public void somewhat();

}

そしてその実装

public class SomewhatAvoidableImpl implements SomewhatAvoidable {

    @Override
    public void avoid() {}

    @Override
    public void somewhat() {}

}

最後に、これらの実装のいずれかを使用するクラス:

public class UsesSomewhatAvoidable {

    private SomewhatAvoidable somewhatAvoidable;

    public UsesSomewhatAvoidable(SomewhatAvoidable somewhatAvoidable) {
        this.somewhatAvoidable = somewhatAvoidable;
    }

    public void someMethod() {
        somewhatAvoidable.avoid();
    }
}

さて、smouthAvoidable.void(); に移動すると、行を入力して、void() メソッドを実装するコードを見つけるよう IDE に要求すると、MostlyAvoidableImpl と SomewhatAvoidableImpl のどちらを意味するのかを尋ねられます。なんで?確かにこれを理解できますか?

Ctrlこれは Idea 10.5 で+ Alt+を押すと発生することですがB(確かに現在はかなり古いバージョンです)、Eclipse の最新バージョンでも発生します。

アイデア 10.5 の動作

編集: 最後の行のタイプミスを修正 - SimplyAvoidImpl を SomewhatAvoidableImpl に変更し、スクリーンショットを追加しました。

4

3 に答える 3

3

私はあなたのすべてのインターフェースとクラスを取り、それを自分の IntelliJ にセットアップしましたが、あなたが説明した問題はありません。

avoidメソッドにキャレットを置き、+ + ( )UsesSomewhatAvoidableを押します。CtrlAltBGo To | Implementation(s)

ここに画像の説明を入力

そして、私は次の実装に行き着きSomewhatAvoidableImplます:

ここに画像の説明を入力

于 2013-05-30T13:46:40.703 に答える
1

確かにこれを理解できますか?

avoid()はい、メソッドが で指定されたインターフェイスを使用して実行されることがわかるはずSomewhatAvoidableです。それが完全に異なるクラスを与えている場合(MostlyAvoidableImplこの場合のように)、それがバグであることがわかる限り(とにかくあなたが与えた例では、どのようSomewhatAvoidableに関連する可能性があるかわかりませんMostlyAvoidableImpl。)どういうわけか IDE を混乱させました - クリーンアップまたは再起動を試して、違いが生じるかどうかを確認してください。

ただし、これは静的解析では決定できないため、より具体的に実装を選択するオプションを有効に提供する場合があります (ただし、プログラムが実行時に正しく動作するためには、明らかにそのような実装を 1 つ選択する必要があります)。

于 2013-05-30T13:43:31.237 に答える
0

あなたが与えたコードから、somewhatAvoidableUsesSomewhatAvoidableクラス内で)はSomewhatAvoidableインターフェースであり、メソッドの実装を持たないとして宣言されていますavoid()。コンパイラ (および IDE) は、実装のためにジャンプしたいクラスを認識できません。

于 2013-05-30T13:41:40.347 に答える