泛型的概念对于java 并不陌生 。 所谓的协变和逆变其实有点类似于类型转换的 , 虽然不准确,姑且这么理解,毕竟是概念上的东西。
我们知道java中的root class 为 java.lang.object, 所有的java类默认的父类 实现。
在java的泛型中,比如 List《object》 , List《string》 虽然 string 是 object的子类,但是 list《object》 却并不是 list《string》 的子类
在java中我们可以使用 通配符类做类型转换 ? 和 super
例如
1 | list<object> objs; |
在kotlin ,没有提供通配符的概念,但是给我们提供了两个 关键字 out 和 in 作为协变和逆变的处理
其中out 可读 只能用于返回值输出
in 可写 只能用于入参输入
1 | class MyClass<out T ,in E>(t : T , e: E) { |
java 和 kotlin 中的区别 :
java 在使用时协变, kotlin在类声明时候协变
java使用 ?通配符, kotlin 使用out,在类声明时候作为修饰符