下面的代码定义了一个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 example
为List(1, 2, 3, Nil)
< / p>
答案 0 :(得分:1)
当你说
时class Foo(s: String, i: Int)
在scala中,它会生成一个类Foo
,其构造函数为String
和Int
。
它与声明为
的java类几乎相同public class Foo {
public Foo(String s, int i) {
...
}
}
对于case类,编译器提供额外的好东西,例如带有默认apply
方法的伴随对象,它采用与构造函数相同的参数。
这就是为什么你可以直接调用Cons(head, tail)
,而无需明确定义构造函数。