learning scasl notes

  接收类型参数的类和特质是“泛型”的,但是它们生成的类型是"参数化"。

       ”泛型“的意思是我们用一个泛化的类或特质来定义许许多多具体的类型。

 

     如果说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].

 

posted @ 2019-08-20 11:07  嵌入式实操  阅读(148)  评论(0编辑  收藏  举报