Scala:伴侣中的“apply”方法是否需要创建case类实例?

时间:2014-09-28 14:38:55

标签: scala traits cons

下面的代码定义了一个List类型和两个表示空列表的案例类的实现,以及创建实际列表的缺点

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 = ...时,列表是由上面的递归应用方法创建的。

如果是这样的话。创建Cons的签名是Cons(head, tail),因为应用的签名不兼容variad def apply[A](as: A*): List[A],scala如何实际推断val exampleList(1, 2, 3, Nil) < / p>

1 个答案:

答案 0 :(得分:1)

当你说

class Foo(s: String, i: Int)

在scala中,它会生成一个类Foo,其构造函数为StringInt

它与声明为

的java类几乎相同
public class Foo {
   public Foo(String s, int i) {
       ...
   }
}

对于case类,编译器提供额外的好东西,例如带有默认apply方法的伴随对象,它采用与构造函数相同的参数。

这就是为什么你可以直接调用Cons(head, tail),而无需明确定义构造函数。