public int product(Iterator i) { return productHelp(i, 1); }
int productHelp(Iterator i, int accumulator) { if (i.hasNext()) { return productHelp(i, accumulator * ((Integer)i.next()).intValue()); } else { return accumulator; } } }
// And, in a separate file:
import java.util.*;
public class Example2 extends Example { int productHelp(Iterator i, int accumulator) { if (accumulator < 1) { throw new RuntimeException("accumulator to productHelp must be >= 1"); } else { return super.productHelp(i, accumulator); } }
public static void main(String[] args) { LinkedList l = new LinkedList(); l.add(new Integer(0)); new Example2().product(l.listIterator()); } }
然而,您可以看到类 Example 的 productHelp 是严格尾递归的。假设一个静态编译器想把这个方法的正文转换成一个循环,如清单 3 所示:
清单 3. 静态编译不会优化尾调用的一个示例 int productHelp(Iterator i, int accumulator) { while (i.hasNext()) { accumulator *= ((Integer)i.next()).intValue(); } return accumulator; }