拉丁的传说
也许您已经知道这一点,但是这个功能并不像听起来那么简单,因为Java语言实际上将堆栈跟踪暴露给程序员。考虑以下程序:public class Test {
public static String f() {
String s = Math.random() > .5 ? f() : g();
return s;
}
public static String g() {
if (Math.random() > .9) {
StackTraceElement[] ste = new Throwable().getStackTrace();
return ste[ste.length / 2].getMethodName();
}
return f();
}
public static void main(String[] args) {
System.out.println(f());
}}即使这有“尾调”,也可能无法优化。(如果它被优化,它仍然需要整个调用堆栈的簿记,因为程序的语义依赖于它。)基本上,这意味着在向后兼容的同时很难支持它。