这是我的示例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
方法。
答案 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调用层次结构的一般用处。