120

根据Scala 语言规范

...允许本地类型推断来限制推断范围[类型参数]的复杂性。必须相对于可接受复杂性的类型集来理解类型的最小性和最大性。

在实践中,限制是什么?

此外,适用于推断表达式类型的限制与适用于参数类型边界的限制是否不同,这些限制是什么?

4

1 回答 1

10

在推断类型时,编译器通常需要计算类型列表的最小上界 (LUB)。例如, 的类型是和if (cond) e1 else e1的类型的 LUB 。e1e1

这些类型可能会变得非常大,例如在 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]...

提交引入了一些健全性检查以限制此类推断类型的深度。

最近有一些工作将插件插入到编译过程中,以检测需要很长时间计算的推断类型,并建议可能需要显式类型注释的位置。

于 2013-02-04T12:38:27.160 回答