方法参数的A *是什么?

时间:2014-12-27 13:46:24

标签: scala

在下面的申请方法中,什么是“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: _*))
      }

1 个答案:

答案 0 :(得分:4)

不,这里有区别。

当您声明asHead: A, asTail: A时,asHeadasTail显然具有相同的类型。但是,在使用as: A*的原始代码中,as.head的类型为Aas.tail的类型为Seq[A] - 可以推断来自headtail的类型。因此,你的代码不是一回事。

声明A*代表&#34;可变数量的A&#34;类型的参数,通常称为 vararg 。这与<{1}}的类似,但在调用中有所不同:

Seq[A]

当使用序列调用vararg方法时,对应的是apply(1, 2, 3) // A* apply(Seq(1, 2, 3)) // Seq[A] 声明:

: _*