zoukankan      html  css  js  c++  java
  • 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].

  • 相关阅读:
    pyhon简单比较文本相似度的方法
    MongoDB数据的导入、导出、备份与恢复
    django实现注册、登录小系统
    nginx+uwsgi部署django的简单介绍
    python操作Excel的几种方式
    Python的Pexpect的简单使用
    JVM之类加载
    Java中的绑定
    JVM之GC
    JVM之内存管理
  • 原文地址:https://www.cnblogs.com/lianghong881018/p/11381774.html
Copyright © 2011-2022 走看看