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>methodDepth1()</code> 的调用层次结构,直到 <code>main</code> 方法显示

4

2 回答 2

2

据我所知,缺乏调用层次结构深度是由于在运行时(重新)评估代码。它在 Java 语言规范中的15.27.4 Lambda 表达式的运行时评估中进行了解释。

在运行时,lambda 表达式的求值类似于类实例创建表达式的求值,只要正常完成产生对对象的引用。lambda 表达式的求值不同于 lambda 主体的执行。

于 2015-05-19T15:27:16.297 回答
0

正如第二张图清楚地显示的那样,Eclipse能够myIf.call()通过内部的方法调用来跟踪调用层次结构methodDepth0。这是正确的,因为(外部)lambda 实现了 method MyIF.call()

相同的模式在下一个嵌套级别中不起作用的事实看起来像一个错误。请考虑为 JDT/UI提交错误。TIA。

请注意,对于实现类似库类型的 lambda Consumer<T>,工作区中的调用者数量accept(T)可能很容易变得难以管理,类似于任何调用层次结构,例如Runnable.run()- 但这并不质疑通过 lambda 调用层次结构的一般有用性。

于 2015-05-24T18:41:27.300 回答