Начиная с Java 8 , Java не обеспечивает Оптимизация Tail-Call (TCO).
Исследовав это, я узнал причину 1006 *, которая:
в классах jdk [...] существует ряд чувствительных к безопасности методов, которые полагаются на подсчет кадров стека между кодом библиотеки jdk и кодом вызова, чтобы выяснить, кто их вызывает.
Однако Scala , основанный на JVM, поддерживает оптимизацию Tail-Call. Scala выполняет оптимизацию хвостовой рекурсии в время компиляции . Почему Java не может использовать тот же подход?
PS: Не уверен, что последняя версия ( Java 11 на данный момент) Java теперь имеет TCO. Было бы здорово, если бы кто-то, кто знает, тоже мог поделиться этим.
Примечание
Я знаю, что TCO находится в отставании и имеет более низкий приоритет, но хочу знать, почему Java не может вносить изменения во время компиляции, подобные Scala.
В Java нет оптимизации хвостового вызова по той же причине, что и в большинстве императивных языков ее нет. Императивные циклы являются предпочтительным стилем языка, и программист может заменить хвостовую рекурсию императивными циклами. ( Источник )