下面的代码会导致编译错误:
Multiple markers at this line
- not found: type A
- not found: type A
在第def headOption
行:
object LazyList {
println("Welcome to the Scala worksheet")
sealed trait Stream[+A]
case object Empty extends Stream[Nothing]
case class Cons[+A](h: () => A, t: () => Stream[A]) extends Stream[A]
object Stream {
def cons[A](hd: => A, tl: => Stream[A]): Stream[A] = {
lazy val head = hd
lazy val tail = tl
Cons(() => head, () => tail)
}
def empty[A]: Stream[A] = Empty
def apply[A](as: A*): Stream[A] =
if (as.isEmpty) empty else cons(as.head, apply(as.tail: _*))
def headOption : Option[A] = this match {
case Empty => None
case Cons(h, t) => Some(h())
}
}
}
但我觉得这个功能定义正确吗?由于A是泛型类型,它不应该导致此编译器错误吗?
答案 0 :(得分:2)
您需要将def headOption
移动到Stream特征中。目前,它位于Stream随播对象中。对象没有类型参数,因为对象只是内存中的一个确定事物,具有完全特定的类型。 Stream特征描述了许多可能的Stream对象,每个对象可以具有不同的类型,对应于创建对象时为A
填充的类型。
请注意,您希望this
中的headOption
引用特定的Stream,而不是引用Stream随播广告对象。
答案 1 :(得分:1)
headOption
应定义为多态函数,就像您对empty
和apply
所做的那样。因此,您需要在函数中添加类型注释,如下所示:
def headOption[A]: Option[A] = ...
但是,通常headOption
应移动到特征,并在伴随对象中定义它是错误的。如果将其移动到特征,则会输入特征,因此您无需向函数添加类型注释,并且您当前的实现将起作用。