接收类型参数的类和特质是“泛型”的,但是它们生成的类型是"参数化"。
”泛型“的意思是我们用一个泛化的类或特质来定义许许多多具体的类型。
如果说S是类型T的子类型,那么Queue[S]应不应该被当作Queue[T]的子类型?
如果是,可以说Queue特质在类型参数T上是协变的(convariant).
trait Queue[+T] { ... }
在类型形参前面上+表示子类型关系在这个参数上是协变。
trait Queue[-T] { ... }
如果说T是类型S的子类型,则表示Queue[S] 是 Queue[T]的子类型。
类型参数是协变的,逆变的,还是不变的,被称作类型参数的型变(variance).
放在类型参数旁边的+和-被称作型变注解(variance annotation).
下界:
class Queue[+T] (private val leading: List[T],
private val trailling: List[T]) {
def enqueue[ U >: T ](x : U) = new Queue[U] (leading, x :: trailling)
}
新的定义给queue添加了一个类型参数U, 并用 ”U >: T"这样的语法定义了U的下界为T,
这样一来, U必须是T的超类型。
假定有一个Fruit类的两个子类Apple和Orange,按Queue类的定义,可以对Queue[Apple]
追加一个Orange,其结果是一个Queue[Fruit].