Eclipse - “开放调用层次结构”停止在 lambda 链中搜索

2022-09-02 04:52:32

这是我的示例 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();
    }
}

当我从 Eclipse(4.4) 打开方法的调用层次结构时,停止搜索下一个调用方:methodDepth2()open call hierarchyopen call hierarchy stop searching next caller method

我所期望的是打开方法的调用层次结构,直到方法显示。methodDepth1()mainopening call hierarchy of method <code>methodDepth1()</code> which show until the <code>main</code> method


答案 1

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

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


答案 2

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

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

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


推荐