文章目录
- 1. 协变 (`out`)
- 1.1 协变概念
- 1.2 协变示例
- 1.3 为什么协变只能读取泛型,而不能修改泛型?
- 1. 原因概述
- 2. 类型安全性问题
- 3. 类型一致性
- 结论
- 2. 逆变 (`in`)
- 2.1 逆变概念
- 2.2 逆变示例
- 2.3 为什么逆变只能修改泛型,不能读取泛型?
- 2.3.1 为什么逆变只能读取泛型,不能修改泛型?
- 2.3.2 如果不限制逆变泛型的读取操作会有什么后果?
- 2.3.3 示例
- 逆变的优势和理解
- 总结
- 3. 不变
- 3.1 不变概念
- 3.2 不变示例
- 4. 使用场景总结
Kotlin
中的泛型形变(variance)
是指如何处理泛型类型
之间的子类型关系
。
在泛型中,如果一个类使用了泛型类型参数
,那么这些参数可以有不同的形变(variance)标记
来指定它们在子类型关系中的行为。
Kotlin 提供了三种形变:
- 协变(covariance)
- 逆变(contravariance)
- 不变(invariance),
分别通过下面几个关键字来进行标记。
- out
- in
- 不使用关键字
1. 协变 (out
)
1.1 协变概念
协变 (out)
允许将泛型类型参数作为输出
,即只能用在 out
位置。
如果一个泛型类 Derived
是另一个泛型类 Base
的子类(Derived : Base
),那么 Generic<Derived>
就可以看作是 Generic<Base>
的子类。
在 Kotlin 中,使用 out
关键字标记泛型类型参数来声明协变
。