在下面的申请方法中,什么是“as:A *”?
List(1, 2, 3)
构建一个类型列表:Cons(1,Cons(2,Cons(3,Nil)))
从阅读方法代码看来,它是一种语法糖 同一类型的多个类型参数?
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: _*))
}
}
如果这是真的,那么这也是有效的:
object List {
def apply[A](asHead: A , asTail : A): List[A] =
if (asHead.isEmpty) Nil
else {
Cons(asHead.head, apply(asTail.tail: _*))
}
答案 0 :(得分:4)
不,这里有区别。
当您声明asHead: A, asTail: A
时,asHead
和asTail
显然具有相同的类型。但是,在使用as: A*
的原始代码中,as.head
的类型为A
,as.tail
的类型为Seq[A]
- 可以推断来自head
和tail
的类型。因此,你的代码不是一回事。
声明A*
代表&#34;可变数量的A&#34;类型的参数,通常称为 vararg 。这与<{1}}的类似,但在调用中有所不同:
Seq[A]
当使用序列调用vararg方法时,对应的是apply(1, 2, 3) // A*
apply(Seq(1, 2, 3)) // Seq[A]
声明:
: _*