下面的代码定义了一个 List 类型和两个案例类的实现,一个代表空列表,一个代表创建实际列表的 Cons
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
object List {
...
def apply[A](as: A*): List[A] = {
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
}
val example = Cons(1, Cons(2, Cons(3, Nil)))
}
我的假设是正确的,即列表是在val example = ...
执行时由上面的递归应用方法创建的。
如果是这样的话。创建 ConsCons(head, tail)
的签名是由于应用的签名不兼容variad
def apply[A](as: A*): List[A]
,scala 是如何实际推断val example
的List(1, 2, 3, Nil)