【问题标题】:Eclipse - `open call hierarchy` stop searching in lambda chainEclipse - “打开调用层次结构”停止在 lambda 链中搜索
【发布时间】:2015-05-15 08:00:57
【问题描述】:

这是我的示例 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 hierarchy 停止搜索下一个呼叫者:

我所期望的是打开方法methodDepth1() 的调用层次结构,直到main 方法显示。

【问题讨论】:

  • 快速补丁:goo.gl/2R0xH4
  • 迁移到 IntelliJ 的充分理由

标签: java eclipse lambda call-hierarchy


【解决方案1】:

据我所知,调用层次结构深度的缺乏是由于在运行时(重新)评估代码造成的。 Java 语言规范中的15.27.4 Run-Time Evaluation of Lambda Expressions 对此进行了解释。

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

【讨论】:

    【解决方案2】:

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

    相同的模式在下一个嵌套级别中不起作用的事实看起来像一个错误。对于 JDT/UI,请考虑 filing a bug。 TIA。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2015-03-10
    相关资源
    最近更新 更多