1

下面的代码定义了一个 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 exampleList(1, 2, 3, Nil)

4

1 回答 1

1

当你说

class Foo(s: String, i: Int)

在 scala 中,它生成一个类Foo,其构造函数采用 aString和 an Int

它与声明为的 java 类几乎相同

public class Foo {
   public Foo(String s, int i) {
       ...
   }
}

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

这就是为什么您可以直接调用Cons(head, tail),而无需显式定义构造函数的原因。

于 2014-09-28T15:02:00.570 回答