当前位置:网站首页>十五、Kotlin进阶学习:一、子类与子类型;二、协变;三、逆变;
十五、Kotlin进阶学习:一、子类与子类型;二、协变;三、逆变;
2022-07-30 05:43:00 【¥伊人独醉】
一、子类与子类型;
(1)通常B类继承A类,B就是A的子类。他们两者是一种继承关系,因为父类A,子类B。(子类)
(2)在需要使用到A类变量时,可以使用B类变量来替代,B就是A的子类型,表达的不一定是继承关系,而一定包含了替代关系。(子类型)
(3)子类一定是父类的子类型。两者构成了子类型关系,但是不一定就是继承关系。继承关系必然产生一个子类型关系。
【案例】

Animal.kt

Dog.kt
MainActivity.kt
日志:
二、协变;
covariant
场景:
通常B类型是A类型的子类型,但是默认情况下,XXX<B>不构成XXX<A>的子类型。此时可以通过添加关键词out将XXX<B>变成XXX<A>的子类型。这种操作就是协变。
问题:
(1)没有协变是什么样子
(2)协变解决了什么
(3)协变的意义
【案例】

日志:
【案例 2】

A.kt

B.kt
MainActivity.kt
日志:
协变的前提条件:泛型参数一定是A的子类或本身。(小于等于A)
【案例 3】

C.kt

D.kt
Container.kt
MainActivity.kt



按钮1日志:

按钮2日志:

【注意】为什么在协变操作的内部不能给协变的子类型进行写入操作?


三、逆变;
contravariance
如果B是A的子类,默认情况下XXX<A>不是XXX<B>的子类型,通过使用关键字in,可以使用XXX<A>构成XXX<B>的子类型,这种操作叫逆变。
需要思考的问题:
(1)没有逆变是什么样子的
(2)逆变帮助我们解决了什么问题
(3)逆变的意义:
为了保证传入XXX<B>(例如ArrayList<in B>)(集合)中的元素实例必须要大于等于B这个类型才是安全的。因为后期需要操作的是对这个集合的写入操作,写入的东西必须是以类型B为上限。不能突破上限,这才是安全的。
【案例】

A.kt

B.kt
MainActivity.kt
日志:
【案例 2】
泛型的使用可以看成一个容器携带若干个元素,元素类型是泛型参数。使用逆变,让原来不是子类型的容器,构成子类型。

Container.kt

MainActivity.kt
日志:
注意:
逆变的前提条件:要实现逆变操作,必须泛型的实际值要构成继承关系。
例如:ArrayList<B>要经过逆变支持ArrayList<A>的传入,则必须B是A的子类。
【案例 3】

B.kt

C.kt
D.kt
MainActivity.kt
【注意】
协变与逆变的相关问题

A.kt

B.kt
C.kt
D.kt
Container.kt
MainActivity.kt



边栏推荐
猜你喜欢

二十一、Kotlin进阶学习:实现简单的网络访问封装
![[Net Ding Cup 2020 Qinglong Group] AreUSerialz](/img/f2/9aef8b8317eff31af2979b3a45b54c.png)
[Net Ding Cup 2020 Qinglong Group] AreUSerialz

MySQL window function

Jdbc & Mysql timeout分析

Blind injection, error injection, wide byte injection, stack injection study notes

FastAPI Quick Start
misc-file steganography of CTF

十七、Kotlin进阶学习:1、守护线程;2、线程和协程之间的效率对比;3、取消协程;

使用kotlin扩展插件/依赖项简化代码(在最新版本4.0以后,此插件已被弃用,故请选择性学习,以了解为主。)

torch distributed training
随机推荐
SQL Server安装教程
JVM学习(二) 垃圾收集器
C#中使用OleDb操作access数据库
Go简单实现协程池
sqli-labs shooting range SQL injection learning Less-1
MySQL 5.7 installation tutorial (all steps, nanny tutorials)
CTF misc-audio and video steganography
TDengine cluster construction
学生成绩管理系统(C语言版)
mysql删除表中重复数据,(只保留一行)
POI工具类
Flink PostgreSQL CDC configuration and FAQ
kali is an essential artifact for information security
uni-app: about custom components, easycom specs, uni_modules, etc.
Function 函数式接口及应用
Mysql 客户端常见异常分析
国内数字藏品交易平台开发市场会开放二级市场吗
SQL Server database generation and execution of SQL scripts
[Mozhe Academy] Identity Authentication Failure Vulnerability Actual Combat
[MATLAB]图像处理——交通标志的识别