Scala 为什么我从这段代码中得到的是队列[Nothing],而不是队列[Book]?

Scala 为什么我从这段代码中得到的是队列[Nothing],而不是队列[Book]?,scala,type-inference,Scala,Type Inference,下面是楼梯手册中的一个示例(经过一些修改): 我在等一个队列[书]。编译器是如何得出这个结论的?我该如何解决这个问题?类型参数混淆了类型推断,我认为是因为第二个构造函数参数Nil。仅使用一个类型参数T: object Queue { // def apply[T, U <: T](xs: U*): Queue[T] = new Queue(xs.toList, Nil) def apply[T](xs: T*): Queue[T] = new Queue(xs.t

下面是楼梯手册中的一个示例(经过一些修改):


我在等一个
队列[书]
。编译器是如何得出这个结论的?我该如何解决这个问题?

类型参数混淆了类型推断,我认为是因为第二个构造函数参数
Nil
。仅使用一个类型参数
T

  object Queue {
    //    def apply[T, U <: T](xs: U*): Queue[T] = new Queue(xs.toList, Nil)
    def apply[T](xs: T*): Queue[T] = new Queue(xs.toList, Nil)

    def apply[T]: Queue[T] = new Queue[T](Nil, Nil)
  }
这将正确地将类型推断为
出版物

    val p = Queue(new Book, new Book, new Book) // Queue[Nothing] ?
  object Queue {
    //    def apply[T, U <: T](xs: U*): Queue[T] = new Queue(xs.toList, Nil)
    def apply[T](xs: T*): Queue[T] = new Queue(xs.toList, Nil)

    def apply[T]: Queue[T] = new Queue[T](Nil, Nil)
  }
val b1 = new Book
val b2 = new Magazine
val b3 = new Journal
val p = Queue(b1, b2, b3)  // Example.Queue[Example.Publication]