1.1. 协变、逆变、非变介绍
协变和逆变主要是用来解决参数化类型的泛化问题。Scala的协变与逆变是非常有特色的,完全解决了Java中泛型的一大缺憾;举例来说,Java中,如果有 A是 B的子类,但 Card[A] 却不是 Card[B] 的子类;而 Scala 中,只要灵活使用协变与逆变,就可以解决此类 Java 泛型问题;
由于参数化类型的参数(参数类型)是可变的,当两个参数化类型的参数是继承关系(可泛化),那被参数化的类型是否也可以泛化呢?Java中这种情况下是不可泛化的,然而Scala提供了三个选择,即协变(“+”)、逆变(“-”)和非变。
下面说一下三种情况的含义,首先假设有参数化特征Queue,那它可以有如下三种定义。
(1) trait Queue[T] {}
这是非变情况。这种情况下,当类型B是类型A的子类型,则Queue[B]与Queue[A]没有任何从属关系,这种情况是和Java一样的。
(2) trait Queue[+T] {}
这是协变情况。这种情况下,当类型B是类型A的子类型,则Queue[B]也可以认为是Queue[A]的子类型,即Queue[B]可以泛化为Queue[A]。也就是被参数化类型的泛化方向与参数类型的方向是一致的,所以称为协变。
(3) trait Queue[-T] {}
这是逆变情况。这种情况下,当类型B是类型A的子类型,则Queue[A]反过来可以认为是Queue[B]的子类型。也就是被参数化类型的泛化方向与参数类型的方向是相反的,所以称为逆变。
1.2. 协变、逆变、非变总结
Ø C[+T]:如果A是B的子类,那么C[A]是C[B]的子类。
Ø C[-T]:如果A是B的子类,那么C[B]是C[A]的子类。
Ø C[T]: 无论A和B是什么关系,C[A]和C[B]没有从属关系。
1.3. 案例

package cn.itcast.scala.enhance.covarianceclass Super
class Sub extends Super
//协变
class Temp1[+A](title: String)
//逆变
class Temp2[-A](title: String)
//非变
class Temp3[A](title: String)object Covariance_demo{def main(args: Array[String]) {//支持协变 Temp1[Sub]还是Temp1[Super]的子类val t1: Temp1[Super] = new Temp1[Sub]("hello scala!!!")//支持逆变 Temp1[Super]是Temp1[Sub]的子类val t2: Temp2[Sub] = new Temp2[Super]("hello scala!!!")//支持非变 Temp3[Super]与Temp3[Sub]没有从属关系,如下代码会报错//val t3: Temp3[Sub] = new Temp3[Super]("hello scala!!!")//val t4: Temp3[Super] = new Temp3[Sub]("hello scala!!!")println(t1.toString)println(t2.toString)}
}

转载于:https://blog.51cto.com/13587708/2154087

spark笔记之Scala中的协变、逆变、非变相关推荐

  1. Scala中Object和Class区别(伴生类和伴生对象)

    文章目录 一,介绍 二,类Class 2.1 类定义 2.2 构造器 1.基本语法 2.构造器参数 2.3 私有成员和Getter/Setter语法 三,单例对象Object 四,伴生对象和伴生类介绍 ...

  2. Scala语言学习笔记——泛型、上下界、视图界定、上下文界定、协变逆变不变、闭包、柯里化

    1.Scala泛型 应用案例1 /*** @author huleikai* @create 2019-05-27 11:23*/ object TestFanXing {def main(args: ...

  3. Scala中协变(+)、逆变(-)、上界(:)、下界(:)简单介绍

    对于一个带类型参数的类型,比如 List[T],如果对A及其子类型B,满足 List[B]也符合List[A]的子类型,那么就称为covariance(协变) , 如果 List[A]是 List[B ...

  4. Spark学习笔记[1]-scala环境安装与基本语法

    Spark学习笔记[1]-scala环境安装与基本语法   正所谓工欲善其事必先利其器,Spark的开发语言不是java而是scala,虽然都是运行于JVM,但是两门语言的基本特性还是有些不一样,这里 ...

  5. 第86讲:Scala中For表达式的生成器、定义和过滤器学习笔记

    第86讲:Scala中For表达式的生成器.定义和过滤器学习笔记 for表达式的生成器定义和过滤和角度讲解for的内容 for表达式中生成器定义和过滤是非常重要的内容. object ForInact ...

  6. C# 4.0中的协变和逆变(一)

    在刚刚落下帷幕的PDC上,我们得到了很多振奋的消息,包括C# 4.0及VS2010等等.Anders Liu 已经 将C# 4.0 新特性白皮书翻译了 出来,那里面有非常详细的介绍. C#的发展是很快 ...

  7. 协变逆变java_Java中的逆变与协变

    什么是逆变与协变 协变(Covariance) 如果B是A的子类,并且F(B)也是F(A)的子类,那么F即为协变 逆变(Contravariance) 如果B是A的子类,并且F(B)成了F(A)的父类 ...

  8. Scala中使用ansj分词库编写spark中文版WordCount

    配置环境的链接:spark在Windows10当中部署搭建Scala的使用环境Maven 编写使用的IDE是IntelliJ IDEA Community Edition 安装配置IntelliJ I ...

  9. 协变逆变java_Java中的协变与逆变

    Java作为面向对象的典型语言,相比于C++而言,对类的继承和派生有着更简洁的设计(比如单根继承). 在继承派生的过程中,是符合Liskov替换原则(LSP)的.LSP总结起来,就一句话: 所有引用基 ...

最新文章

  1. Liferay 集群 (fail-over)
  2. 控制ALV单元格可编辑
  3. sap-生产订单的成本理解
  4. 初使用swagger遇到的问题(1)
  5. apicloud入门学习笔记1:简单介绍
  6. vue2.0中vue-router使用总结
  7. rocketmq namesrv 第一章启动过程
  8. python不换行空格输出_解决Python print输出不换行没空格的问题
  9. 密码库LibTomCrypt学习记录——(1.0)分组密码算法——概述
  10. 设置JAVA-HOME的用处
  11. 【多线程经典实例】实现一个线程安全的单例模式
  12. JDK下载、安装与配置
  13. OpenCV:图像锐化
  14. 服务器后台自动运行程序和停止
  15. 优化网站提高打开速度
  16. ggplot2绘制点图
  17. python pdf脚本之家_Python实现简单拆分PDF文件的方法
  18. PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: 'C:\\Users\\ADMINI~1\\AppDa ta\\Local\\Temp\\pi
  19. Flink Table 和 DataStream 转换
  20. python怎么批量下载年报_使用Python批量下载Wind数据库中的PDF报告

热门文章

  1. 软件测试工程师除了找BUG,还能干啥?
  2. 9个开源自动化测试框架,质量保证测试工程师用起来
  3. linux下搭建博客day4注册git账号
  4. java的num的数据类型_Java基础---Java数据类型
  5. Fiddler抓取HTTPS最全(强)攻略!
  6. 测试工程师面试必问的十道题目!全答上来的直接免试
  7. 播放列表php代码,【求助】如何直接在Discuz! 代码 FLASH代码中添加优酷播放列表...
  8. ros 发布信息频率_ROS入门笔记二基础
  9. 2个相同的 stm32 can通讯不成功_STM32芯片的几种烧写方式简介
  10. python单引号双引号三引号_python中的单引号、双引号和三引号有何区别