Почему компилятор Scala не применяет оптимизацию хвостового вызова, если только метод не является окончательным?
Например, это:
class C {
@tailrec def fact(n: Int, result: Int): Int =
if(n == 0)
result
else
fact(n - 1, n * result)
}
приводит к
error: не удалось оптимизировать метод @tailrec annotated: он не является ни закрытым, ни окончательным, поэтому его можно переопределить
Что именно пойдет не так, если компилятор применил TCO в таком случае?