1
下面是从楼梯书(有一些修改)的例子:为什么我从这段代码中得到Queue [Nothing]而不是Queue [Book]?
object Example {
class Queue[+T] private (
private[this] var leading: List[T],
private [this] var trailing: List[T]
) {
private def mirror: Unit = {
if(leading.isEmpty) {
while(!trailing.isEmpty) {
leading = trailing.head :: leading
trailing = trailing.tail
}
}
}
def this() = this(Nil, Nil)
def head: T = {
mirror
leading.head
}
def tail: Queue[T] = {
mirror
new Queue(leading.tail, trailing)
}
def enqueue[U >: T](x: U) = new Queue[U](leading, x :: trailing)
def enqueue[U >: T](xs: U*) = new Queue[U](leading, xs.reverse.toList ::: trailing)
def size = leading.size + trailing.size
}
object Queue {
def apply[T, U <: T](xs: U*): Queue[T] = new Queue(xs.toList, Nil)
def apply[T]: Queue[T] = new Queue[T](Nil, Nil)
}
class Publication
class Book extends Publication
class Novel extends Book
class Journal extends Publication
class Magazine extends Publication
}
object Test {
import Example._
{
val q = new Queue[Int]()
val q1 = q.enqueue[Int](1, 2, 3)
q1.head // 1
val p = Queue(new Book, new Book, new Book) // Queue[Nothing] ?
}
}
我得到的类型Queue[Nothing]
的p
从这一行:
val p = Queue(new Book, new Book, new Book) // Queue[Nothing] ?
我期待一个Queue[Book]
。编译器如何得出这个结论,我该如何解决这个问题?