根据《Scala语言规范》:
此外,适用于推断表达式类型的限制是否不同于适用于参数类型边界的限制,这些限制是什么?
实际上,有哪些限制呢?...允许局部类型推断来限制推断的类型参数边界的复杂性。最小和最大类型必须相对于可接受复杂度的类型集合进行理解。
此外,适用于推断表达式类型的限制是否不同于适用于参数类型边界的限制,这些限制是什么?
实际上,有哪些限制呢?...允许局部类型推断来限制推断的类型参数边界的复杂性。最小和最大类型必须相对于可接受复杂度的类型集合进行理解。
在推断类型时,编译器通常需要计算一系列类型的最小上界(LUB)。例如,if (cond) e1 else e1
的类型是 e1
和 e1
类型的 LUB。
这些类型可能会变得非常庞大,例如在 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]...
这个提交引入了一些健全性检查,以限制这种推断类型的深度。
最近增加了一些工作流程来插件编译过程中以检测计算时间较长的推断类型,并建议在某些地方使用显式类型注释。