In Vs Out
首先申明另个概念,一个泛型类或者泛型接口中的方法,
接受入参的地方成为in,返回值的地方称为out
协变
协变的定义
1、协变使用out关键字来修饰类型参数,意味着该类型只能出现在输出的位置。
class MyClass<out T>(val data:T) {
fun get(): T? = data
}
协变的特点
1、假设定义了一个MyClass的泛型类,其中Man是Person的子类,同时MyClass 是MyClass的子类,我们就称为MyClass在T这个泛型上是协变的。
2、因为协变会导致泛型T出现在out的位置上,导致对于泛型类在泛型数据上是可读的。
逆变
逆变的定义
1、逆变使用in关键字来修饰类型参数,意味着该类型只能出现在输入的位置。
class MyClass<in T> {
fun test(item: T) {
// 处理这个item数据
}
}
逆变的特点
1、假设定义了一个MyClass的泛型类,其中Man是Person的子类,同时MyClass是MyClass的子类,我们称为MyClass在这个泛型T上是逆变的。
2、因为逆变会导致泛型T出现在in的位置上,导致对于泛型类在泛型数据上是可写的。