您的位置:首页 > 其它

Kotlin 泛型的协变和逆变

2017-09-20 00:43 302 查看

Kotlin 泛型

Kotlin 泛型的基本语法类似于 Java ,不过出于型变安全,不支持 Java 中的<? extends T>,<?super T> 通配符型变约束,而是采用类似 C# 的 in,out 用于支持协变和逆变,这同时避免了处理子类型化,父类化的问题(即Java泛型中典型的List<T> 不是 List<Object>的子类型的问题);基本的泛型语法可以参考官方中文文档:https://www.kotlincn.net/docs/reference/

Kotlin 对于型变的支持

kotlin 使用类似 C# 泛型的方式,将型变分为协变,逆变,分别提供in,out 关键字对其进行支持;
协变(covariant:Foo<父类> => Foo<子类>)协变为父类泛型型变为具体子类,Kotlin 提供 in 关键字,来代替 Java 中<? extends E> 的通配符语法,同时为了解决Java中泛型型变类型擦除中,所引起的类型转换安全,Kotlin 采用了 C# 的策略,即协变类型作为消费者,只能读取而不能写入;逆变(contravariance:Foo<子类> => Foo<父类>)逆变为子类型型变为具体父类,Kotlin 提供 out 关键字,来代替 Java 中<? super E> 的通配符语法,同样采用了 C# 的策略,逆变类型作为生产者,只能写入而不能读取;这里使用官方中文文档中的2个例子,可以很直观地演示这个概念:
//协变过程
fun copy(from: Array<out Any>, to: Array<Any>){
....
}
//逆变过程
fun fill(dest: Array<in Any> , value: Array<Any>){
.....
}
以上例子中 copy 函数为将 from 参数复制到 to 参数,from 数组作为生产者,to数组作为消费者,使用 in 确保逆变安全;fill 函数将 value 数组填充到 dest 数组,dest 数组为消费者,value 数组为生产者,使用 out 确保协变安全;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: