请帮助解释Scala构造函数和伴生对象的一个案例

请帮助解释Scala构造函数和伴生对象的一个案例,scala,pattern-matching,Scala,Pattern Matching,我想我在下面对我的问题的解释中会犯一些错误 但在我的理解力有限的情况下,我不知道如何正确地描述这个问题 scala代码如下所示: 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

我想我在下面对我的问题的解释中会犯一些错误 但在我的理解力有限的情况下,我不知道如何正确地描述这个问题

scala代码如下所示:

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: _*))
}
如果将对象x创建为: val x=列表(1,2,3)

我进入同伴对象“列表”,三个数字是:1、2和3 然后,在内部触发函数apply 在构建的时候,这三个数字怎么会有这样的方法/属性:as.head和as.tail

我想这可能是一种模式匹配,但即便如此,我也无法理解数字“as”现在有“.head”和“.tail”的方法/属性的魔力


诀窍在于,
as:A*
是一个变量参数,它被转换为类似数组的对象,实际上是一个
WrappedArray$ofInt
。 有
head
tail
方法

您可以扩展
List
对象的定义,以查看
A*
的类,如下所示:

object List {
  def apply[A](as: A*):List[A] = {
    println(as.getClass)    
    if (as.isEmpty) Nil
    else Cons(as.head, apply(as.tail: _*))
  }
}
有关更详细的解释,请检查,例如..

在REPL中尝试此选项

scala> def apply[A](as :A*) = as
apply: [A](as: A*)Seq[A]

因此,编译器将varargs变量
视为
,类型为
Seq[A]
,这就是
.head
.tail
的来源。

。所有规范都保证它是一个
Seq
。请不要在任何情况下对
as
的类型做出任何假设,除非
Seq
@rics:谢谢