Рассмотрим следующее взаимодействие с REPL. Сначала мы определяем класс с факториальным методом:
scala> class C {
def fact(n: Int, result: Int): Int =
if(n == 0) result
else fact(n - 1, n * result)
}
defined class C
scala> (new C).fact(5, 1)
res11: Int = 120
Теперь давайте переопределим его в подклассе, чтобы удвоить ответ суперкласса:
scala> class C2 extends C {
override def fact(n: Int, result: Int): Int = 2 * super.fact(n, result)
}
defined class C2
scala> (new C).fact(5, 1)
res12: Int = 120
scala> (new C2).fact(5, 1)
Какой результат вы ожидаете для этого последний звонок? Вы можете ожидать 240. Но нет:
scala> (new C2).fact(5, 1)
res13: Int = 7680
Это потому, что, когда метод суперкласса делает рекурсивный вызов, рекурсивный вызов проходит через подкласс.
Если переопределение работает так, что 240 был правильным ответом, тогда было бы безопасно, чтобы оптимизация хвостового вызова выполнялась в суперклассе. Но это не так, как работает Scala (или Java).
Если метод не помечен как final, он может не вызывать себя , когда он делает рекурсивный вызов.
И вот почему @tailrec не работает, если метод не является окончательным (или закрытым).
UPDATE: Я рекомендую прочитать другие два ответа (John's and Rex's).
Получил ответ. Если мы посмотрим на классы, сгенерированные таблицей данных, вы можете найти класс-оболочку. Я просто добавил свойство, называемое min-height, в своем классе CSS в оболочку, и проблема была исправлена.
dataTables_wrapper{
min-height: 100px;
}