协变逆变和不变 | 学习笔记

简介: 快速学习协变逆变和不变

开发者学堂课程【Scala 核心编程 - 进阶协变逆变和不变学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9159


协变逆变和不变


基本介绍

1.Scala 的协变(+),逆变(-),协变 covariant、逆变 contravariant、不可变 invariant。

2.对于一个带类型参数的类型,比如 List[T] ,如果对A及其子类型B,满足 List[B] 也符合 List[A] 的子类型,那么就称为 covariance(协变),如果 List[A] 是 List[B] 的子类型,即与原来的父子关系正相反,则称为 contravariance(逆变)。

如果一个类型支持协变或逆变,则称这个类型为 variance (翻译为可变的或变型),否则称为 invariance (不可变的)

3.在 Java 里,泛型类型都是 invariant,比如 List<String> 并不是 List<Object> 的子类型。而 scala 支持,可以在定义类型时声明(用加号表示为协变,减号表示逆变),

如: trait List[+T]//在类型定义时声明为协变这样会把List[String] 作为 List[Any] 的子类型。

应用实例

注意:在这里引入关于这个符号的说明,在声明 Scala 的泛型类型时,“+”表示协变,而“-"表示逆变

C[+T]:如果A是B的子类,那么C[A]是C[B]的子类,称为协变

C[-T]:如果A是B的子类,那么C[B]是C[A]的子类,称为逆变

C[T]:无论A和B是什么关系,C[A]和C[B]没有从属关系。称为不变。

代码:

val t:Temp[Super]=new Temp[Sub]("hello world1")

class Temp3[A](title:String){//Temp3[+A]7//Temp[-A]

override def toString:String={

title

}}

//支持协变 class Super

class Sub extends Super

写一段代码命名为covariantcontravariant引用上方代码

class Super//父类

//Sub是Super的子类

//不变

class Temp3[A](title: String){//Temp3[+A] //Temp[-A]

override def tostring: String ={

title

}

}

不变的特性

指定代码 va1 t1:Temp3[Sub]=new Temp3[Sub](“hello”);//ok

因为 Temp3[Sub] 不变,Temp3[Sub] 与 Temp3[Sub] 的类型是相同的,没有任何影响。

va1 t2:Temp3[Sub]=new Temp3[Super](“hello”);//error

va1 t3:Temp3[Super]=new Temp3[Sub](“hello”);//error

因为不变所以 Temp3[Super] 与 Temp3[Sub] 没有任何关系。

2.//协变

class Temp4[+A](title: String){//Temp3[+A] //Temp[-A]

override def tostring: String ={

title

}

}

协变的特性

va1 t4:Temp3[Sub]=new Temp3[Sub](“hello”);//ok

Temp3[Sub] 与 Temp3[Sub] 的类型是相同的,没有任何影响。

va1 t5:Temp4[Super]=new Temp4[Sub](“hello”);//ok

va1 t6:Temp4[Sub]=new Temp4[Super](“hello”);//error

支持协变,意味着 Sub 是 Super 的子类那么泛型也支持Sub是Super的子类。Sub 与 Super 相反则错误。

3.//逆变

class Temp5[-A](title: String){//Temp3[+A] //Temp[-A]

override def tostring: String ={

title

}

}

逆变的特性

va1 t7:Temp5[Sub]=new Temp4[Sub](“hello”);//ok

Temp5[Sub] 与 Temp5[Sub] 的类型是相同的,没有任何影响。

va1 t8:Temp5[Sub]=new Temp4[Super](“hello”);//ok

va1 t9:Temp5[Super]=new Temp4[Sub](“hello”);//error

Sub是Super的子类,因为发生逆变则相反。

相关文章
|
网络安全 Docker 容器
内网穿透访问你家里的树莓派
你有一个自己的外网服务器,然后捏你又买了一个树莓派放家里吃灰,有一天,你觉得不能让你的树莓派吃灰,你想上班的时候用你的树莓派在家里编译arm用的镜像程序。于是,便有了本篇文章~~~如何通过内网穿透访问你家里的树莓派。(注:仅用于测试,闹着玩,千万别上生产,上生产需要自己进行改造用户权限以及审计功能,这部分就不贴出来了) 使用的工具:docker,rtty,rttys
539 0
内网穿透访问你家里的树莓派
|
2月前
|
负载均衡 Java Nacos
微服务架构中的服务注册与发现流程
本内容介绍了微服务架构中的服务注册与发现流程,包括服务注册中心(如Nacos)、服务提供者和调用者的角色分工。服务启动时自动注册信息至注册中心,调用者通过客户端负载均衡(如Spring Cloud Loadbalancer)选取服务实例进行远程调用。同时,内容还讲解了OpenFeign的工作原理,其作为HTTP客户端集成负载均衡,通过接口定义、代理生成、请求发送与结果解析,实现服务间的高效通信。
|
11月前
|
存储 Shell Linux
用户和用户组
本文介绍了Linux系统中的用户账户和组的基本概念,包括普通用户和超级用户(root)的定义和区别,以及组的概念和作用。文章还详细描述了用户账户和组的相关文件(如/etc/passwd、/etc/shadow、/etc/group和/etc/gshadow)的结构和内容,并提供了创建和删除用户账户及组的基本命令和选项。
576 2
|
6月前
|
数据采集 人工智能 测试技术
Python有哪些好用且实用的Web框架?
Python 是一门功能强大的编程语言,在多个领域中得到广泛应用,包括爬虫、人工智能、游戏开发、自动化测试和 Web 开发。在 Web 开发中,Python 提供了多种框架以提高效率。以下是几个常用的 Python Web 框架:1) Django:开源框架,支持多种数据库引擎,适合新手;2) Flask:轻量级框架,基于简单核心并通过扩展增加功能;3) Web2py:免费开源框架,支持快速开发;4) Tornado:同时作为 Web 服务器和框架,适合高并发场景;5) CherryPy:简单易用的框架,连接 Web 服务器与 Python 代码。这些框架各有特色,可根据需求选择合适的工具。
305 14
|
7月前
|
监控 搜索推荐 数据挖掘
多维度组织支撑:提升CRM线索客户资源分配效率
在当今商业环境中,客户关系管理(CRM)系统是企业提升销售效率和客户满意度的关键工具。其中,多维度组织支撑下的线索客户资源分配尤为重要。它通过自动化分配、个性化服务和数据分析,优化销售流程,提高转化率与客户体验。实施步骤包括建立统一平台、制定分配规则、优化跟进流程及数据驱动决策。实际案例如联想和海康威视借助CRM系统实现了全流程优化,显著提升了销售效率与业绩。这一趋势助力企业在竞争中脱颖而出,实现可持续发展。
|
资源调度 JavaScript 前端开发
yarn源|yarn 国内镜像+linux删除大量文件
yarn源|yarn 国内镜像yarn源|yarn 国内镜像+linux删除大量文件
1384 0
|
人工智能 自然语言处理 搜索推荐
彻底摒弃人工标注,AutoAlign方法基于大模型让知识图谱对齐全自动化
【8月更文挑战第18天】知识图谱作为结构化语义库,在AI领域应用广泛,但构建中实体对齐难题一直存在。近期,AutoAlign提供了一种全自动对齐方案,由张锐等人研发并发布于arXiv。此方法摒弃传统的人工标注依赖,利用大型语言模型实现全自动化对齐。AutoAlign包括谓词与实体对齐两部分,通过构建谓词邻近图及计算实体嵌入,有效提升对齐性能。实验显示其性能超越现有方法,尤其适用于大规模数据集。尽管如此,AutoAlign仍面临计算资源消耗及不同领域适应性等挑战,未来需进一步优化以增强鲁棒性和泛化能力。
393 7
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
【51单片机】开发板上矩阵键盘键码在数码管上的显示,按下键盘在数码管上显示对应段码
453 0
|
关系型数据库 MySQL 机器人
【MySQL】两个脚本自动化搞定 MySQL 备份恢复--XtraBackup
【MySQL】两个脚本自动化搞定 MySQL 备份恢复--XtraBackup
RecyclerView 实现纵向,横向,和瀑布流 的滚动布局
RecyclerView 实现纵向,横向,和瀑布流 的滚动布局
RecyclerView 实现纵向,横向,和瀑布流 的滚动布局