Kotlin 泛型的协变和逆变

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 确保协变安全;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值