Kotlin 中的协变和逆变

泛型的概念对于java 并不陌生 。 所谓的协变和逆变其实有点类似于类型转换的 , 虽然不准确,姑且这么理解,毕竟是概念上的东西。

我们知道java中的root class 为 java.lang.object, 所有的java类默认的父类 实现。

在java的泛型中,比如 List《object》 , List《string》 虽然 string 是 object的子类,但是 list《object》 却并不是 list《string》 的子类
在java中我们可以使用 通配符类做类型转换 ? 和 super

例如

1
2
3
4
5
6
7
8
9
10
11
12
list<object> objs;
list<string> strs ;

objs = strs ;是错误的

修改为

list< ? extends object> objs; // 重点是 ? 通配符
list<string> strs ;

objs = strs ;正确做法

在kotlin ,没有提供通配符的概念,但是给我们提供了两个 关键字 out 和 in 作为协变和逆变的处理
其中out 可读 只能用于返回值输出
in 可写 只能用于入参输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
	class MyClass<out T  ,in E>(t : T , e: E) {

fun get(): T? {
return variable
}

fun setVal(e: E) {
this.var2 = e
}


private var variable : T
private var var2 : E;

init {
this.variable = t
this.var2 = e;
}
}

java 和 kotlin 中的区别 :

java 在使用时协变, kotlin在类声明时候协变
java使用 ?通配符, kotlin 使用out,在类声明时候作为修饰符