Eclipse - `open call hierarchy`停止在lambda链中搜索

时间:2015-05-15 08:00:58

标签: java eclipse lambda call-hierarchy

这是我的示例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停止搜索下一位来电者: open call hierarchy stop searching next caller method

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

2 个答案:

答案 0 :(得分:2)

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

  

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

答案 1 :(得分:0)

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

同一模式在下一个嵌套级别不起作用的事实看起来像一个bug。请考虑filing a bug以获取JDT / UI。 TIA。

请注意,对于实现像Consumer<T>这样的库类型的lambdas,工作空间中调用者accept(T)的数量可能很容易变得难以管理,类似于任何调用层次结构,例如{{1} - 但这并不质疑通过lambdas调用层次结构的一般用处。