• 类型关系

    Scala 支持在泛型类上使用型变注释,用来表示复杂类型、组合类型的子类型关系间的相关性

    • 协变 +T,变化方向相同,通常用在生产

      假设 A extends T, 对于 Clazz[+T],则 Clazz[A] 也可看做 Clazz[T]

      // 官网示例
      abstract class Animal {
      def name: String
      }
      case class Cat(name: String) extends Animal
      case class Dog(name: String) extends Animal

      由于 Scala 标准库中不可变 List 的定义为 List[+A],因此 List[Cat]List[Animal] 的子类型, List[Dog] 也是 List[Animal] 的子类型,所以可直接将他们当作 List[Animal] 使用。

      // 官网示例
      object CovarianceTest extends App {
      def printAnimalNames(animals: List[Animal]): Unit = {
      animals.foreach { animal =>
      println(animal.name)
      }
      } val cats: List[Cat] = List(Cat("Whiskers"), Cat("Tom"))
      val dogs: List[Dog] = List(Dog("Fido"), Dog("Rex")) printAnimalNames(cats)
      // Whiskers
      // Tom printAnimalNames(dogs)
      // Fido
      // Rex
      }
    • 逆变 -T,变化方向相反,通常用在消费

      假设 A extends T, 对于 Clazz[-T],则 Clazz[T] 也可看做 Clazz[A]

      // 官网示例
      abstract class Printer[-A] {
      def print(value: A): Unit
      } class AnimalPrinter extends Printer[Animal] {
      def print(animal: Animal): Unit =
      println("The animal's name is: " + animal.name)
      } class CatPrinter extends Printer[Cat] {
      def print(cat: Cat): Unit =
      println("The cat's name is: " + cat.name)
      } object ContravarianceTest extends App {
      val myCat: Cat = Cat("Boots") def printMyCat(printer: Printer[Cat]): Unit = {
      printer.print(myCat)
      } val catPrinter: Printer[Cat] = new CatPrinter
      val animalPrinter: Printer[Animal] = new AnimalPrinter printMyCat(catPrinter)
      printMyCat(animalPrinter) // 将 Printer[Animal] 当作 Printer[Cat] 使用
      }

最新文章

  1. Ubuntu14.04无法在var/www内新建文档
  2. phpstrom正则替换
  3. 深入理解OOP(第一天):多态和继承(初期绑定和编译时多态)
  4. django动态表格总结
  5. Oracle分析函数的项目实践实例
  6. 简单加密算法在C#中的实现
  7. JavaScript基本概念(操作符)
  8. PHP - 遍历文件夹下的所有文件名
  9. WebLogic部署集群和代理服务器
  10. javascript第一篇----使用简介
  11. linux修改TCP最大连接数
  12. 第6次结对作业--郑锦伟&古维城
  13. JavaScript 高级
  14. Ajax简述
  15. 【JVM虚拟机】(4)---性能调优
  16. 去掉word页眉上横线的技巧
  17. python随机生成6位数验证码
  18. 腾讯云启动数据库进程,提示No such host is known
  19. 【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-7 混合概率密度
  20. Linux下阅读MHT文件

热门文章

  1. qt 操作串口
  2. MyCat教程三:安装及配置介绍
  3. SwitchGame---MybatisPLus
  4. spoon数据转换中文乱码(kettle)
  5. MySQL数据物理备份之xtrabackup
  6. Linux操作系统的日志管理之rsyslog实战案例
  7. Matplotlib 绘制定制的直方图
  8. 目标检测论文解读11——Mask R-CNN
  9. linux 文件上传 linux服务器
  10. q1096