21

これが私のサンプルJavaコードです:

public class Test {

    public static void main(String[] args) {
        methodDepth0(
            ()->
                methodDepth1(
                    ()->
                        methodDepth2()
                )
        );
    }

    static Object methodDepth2() {
        return null;
    }

    interface MyIF {
        void call();
    }

    static void methodDepth0(MyIF myIf){
        myIf.call();
    }

    interface MyIF2 {
        void call();
    }

    static void methodDepth1(MyIF2 myIf2){
        myIf2.call();
    }
}

methodDepth2()Eclipse(4.4) から メソッドの呼び出し階層を開くと、open call hierarchy次の呼び出し元の検索を停止します。 呼び出し階層を開く 次の呼び出し元メソッドの検索を停止する

私が期待しているのはmethodDepth1()、メソッドまで表示されるメソッドの呼び出し階層を開くようなものmainです。 <code>main</code> メソッドまでを示すメソッド <code>methodDepth1()</code> の呼び出し階層を開く

4

2 に答える 2

2

私が言えることから、呼び出し階層の深さの欠如は、実行時のコードの (再) 評価によるものです。Java 言語仕様の15.27.4ラムダ式の実行時評価で説明されています。

実行時のラムダ式の評価は、通常の完了によってオブジェクトへの参照が生成される限り、クラス インスタンス作成式の評価に似ています。ラムダ式の評価は、ラムダ本体の実行とは異なります。

于 2015-05-19T15:27:16.297 に答える
0

2 番目の図が明確に示しているように、EclipsemyIf.call()内部のメソッド呼び出しを通じて呼び出し階層をトレースできますmethodDepth0。(外側の) ラムダが method を実装しているため、これは正しいMyIF.call()です。

次のネスト レベルで同じパターンが機能しないという事実は、バグのように見えます。JDT/UIのバグを報告することを検討してください。ティア。

のようなライブラリ型を実装するラムダの場合、ワークスペース内Consumer<T>の呼び出し元の数はaccept(T)、たとえば次のような呼び出し階層と同様に、簡単に管理できなくなる可能性があることにRunnable.run()注意してください。

于 2015-05-24T18:41:27.300 に答える