В соответствии с Scala Language Spec:
... вывод локального типа разрешен для ограничения сложности выведенных границ [параметров типа]. Минимальные и максимальные типы должны быть поняты по отношению к набору типов приемлемой сложности.
На практике, каковы пределы?
Кроме того, существуют ли разные ограничения, применимые к типам выведенных выражений, чем к ограничениям типа параметра и каковы эти пределы?
При выводе типов компилятор часто должен рассчитать наименьшую верхнюю границу (LUB) списка типов. Например, тип if (cond) e1 else e1
- это LUB типов e1
и e1
.
Эти типы могут быть довольно большими, например, попробовать это в REPL:
:type Map(1 -> (1 to 10), 2 -> (1 to 10).toList)
scala.collection.immutable.Map[Int,scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int] with Serializable{def reverse: scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]{def reverse: scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def dropRight(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def takeRight(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def drop(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def take(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]}; def dropRight(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]{def reverse: scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def dropRight(n: Int): scala.collection.immutable.Seq[Int]...
Этот commit ввел некоторые проверки здравомыслия, чтобы ограничить глубину таких предполагаемых типов.
Была проведена некоторая недавняя работа по подключению к процессу компиляции для обнаружения выведенных типов, которые занимают много времени для расчета, и предлагают места, где явная аннотация типа может быть разумной.