我们还是使用前面的Queue的例子,我们知道,我们不能使用+T(协变关系)来定义Queue,然而,我们可以通过给equeue方法本身提供一个类型参数使之一般化。
class Queue[+T] ( private val leading: List[T], private val trailing: List[T] { def enqueue[U >: T ](x: U) = new Queue[U](leading, x:: trailing) }
在这个新定义中,使用了一个新的类型参数U, 语法结构 U >: T ,定义T为U的下界,因此U必须是T的一个父类。 enqueue的返回类型也变成Queue[U],而不是之前的enqueue[T]。
举例来说,比如说一个Fruit类定义了两个子类Apple和Orange, 使用这个新的enqueue定义,可以把一个Orange对象添加到一个Queue[Apple]队列中,其返回结果为一个Queue[Fruit]类型。