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

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

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

最新文章

  1. 【背景建模】PBAS
  2. SQL SERVER中架构的理解
  3. Scala语言初识
  4. Bash中的$符号
  5. Dynamic系列--Dynamic 与反序列化
  6. Android进程间通信(IPC)机制Binder简要介绍和学习计划
  7. mongodb中数据类型的坑
  8. 三点顺序_nyoj_68(计算几何).java
  9. 纪中集训 Day 8 & Last Day
  10. Spring cloud Greenwich Eureka
  11. uva11754 中国剩余定理+暴力搜索
  12. 20190320 Dojo常用方法总结
  13. 并发编程---IO模型
  14. SAP字段与表的对应关系
  15. SpringMvc和Mybatis整合总结
  16. 自动化工具gulp搭建环境(详解)
  17. BZOJ 1208 宠物收养所 set+二分
  18. luogu2296 [NOIp2014]寻找道路 (bfs)
  19. 关于DIY操作系统的断更道歉
  20. Android SharedPreference

热门文章

  1. 【转】ZYNQ中三种实现GPIO的方式
  2. Gradle 翻译 tips and recipes 使用技巧 MD
  3. Linux学习笔记之tail命令显示最后n行
  4. Spring Boot Freemarker特别篇之contextPath【从零开始学Spring Boot
  5. JS中的逻辑运算符&&、||
  6. selenium中的元素操作之三大切换(二)
  7. Workerman简单开发示例实践(一)
  8. Java虚拟机如何运行Java字节码
  9. 日志 logback-spring.xml配置
  10. DoNetCore Web Api 采用Swagger进行接口文档管理