kotin协变、逆变

107 阅读1分钟

In Vs Out

首先申明另个概念,一个泛型类或者泛型接口中的方法

接受入参的地方成为in,返回值的地方称为out

协变

协变的定义

1、协变使用out关键字来修饰类型参数,意味着该类型只能出现在输出的位置。

class MyClass<out T>(val data:T) {
    fun get(): T? = data
}

协变的特点

1、假设定义了一个MyClass的泛型类,其中Man是Person的子类,同时MyClass 是MyClass的子类,我们就称为MyClassT这个泛型上是协变的。

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的位置上,导致对于泛型类泛型数据上是可写的。