首先,这不是特定的
BiFunction。因此,您基本上是在问,您可以嵌套方法调用的深度有多深,简单的答案是Java编程语言本身并未指定限制。
有一些技术限制可能会限制数量,但是,这是技术限制,而不是规格限制。当技术发展而无需更改规格时,它们可能会被解除。
正如AlainO’Dea所解释的,如果最后一条指令应由异常处理程序覆盖,则方法的代码大小限制为65535字节或65534字节。此代码大小支持的嵌套方法调用的数量取决于某些因素。例如,您正在使用
interface和接口方法调用,而不是具体的类方法调用(调用虚拟指令)使用更多的字节,而且,您正在使用
BiFunction<Integer,Integer, Integer>而不是简单明了,
IntBinaryOperator因此每次调用都涉及将
int值装箱,这需要附加代码。
但是无论如何,还有另一个技术限制,即编译器实现。尝试以较高的嵌套计数编译示例时,
javac从命令行以1500嵌套调用终止了stackoverflow,而Netbeans(使用与相同的编译器代码
javac)设法在IDE开始表现出奇怪行为之前编译了2000嵌套调用。
(我猜想,它不能很好地处理编译器/语法荧光笔的堆栈溢出)。
这表明IDE具有更高的堆栈大小,或者环境设置中的其他差异影响了表达式解析之前的初始堆栈深度。由此得出结论,实践中没有硬性限制。您也许可以编写一个编译器可以毫无问题地编译而另一个编译器却可以解决的代码,这不是一个好主意。
毕竟,等价于您问题的代码可以写成:
public static int methodContainingMethod( int a, int b, int c, BiFunction<Integer, Integer, Integer> theFunction) { int value = theFunction.apply(a, b); for(int i=0; i<asDeepAsYouWannaGo; i++) value=theFunction.apply(value, c); return value;}
尽管我认为您的想法更像是:
public static int methodContainingMethod( IntBinaryOperator theFunction, int first, int second, int... rest) { int value = theFunction.applyAsInt(first, second); for(int next: rest) value=theFunction.applyAsInt(value, next); return value;}
要么
public static OptionalInt methodContainingMethod( IntBinaryOperator theFunction, int... arguments) { return IntStream.of(arguments).reduce(theFunction);}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)