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 确保协变安全;
相关文章推荐
- Kotlin基础 — 泛型、变体(协变、逆变、不变)
- kotlin中的高级特性--协变与逆变(反变)
- .NET泛型03,泛型类型的转换,协变和逆变
- 泛型中的协变和逆变
- 第五节:泛型(泛型类、接口、方法、委托、泛型约束、泛型缓存、逆变和协变)
- 泛型--协变与逆变(转)
- 泛型的协变和逆变的概念引入
- 泛型接口的协变和逆变
- C# 入门(13) 泛型(generic)、协变(convariance)、逆变(contravariance)
- 泛型类型的协变(covariant)和逆变
- C#中泛型方法与泛型接口 C#泛型接口 List<IAll> arssr = new List<IAll>(); interface IPerson<T> c# List<接口>小技巧 泛型接口协变逆变的几个问题
- 泛型类型的转换,协变和逆变
- 泛型的协变,逆变
- .NET 4.0中的泛型的协变和逆变
- 泛型在接口中的协变、逆变练习
- [译]委托和接口泛型参数类型的协变和逆变
- iOS 关键字 及 泛型的使用 和 协变、逆变
- scala 泛型之初解,定界,类型约束,逆变与协变
- 使用泛型实现类型转化-使用通配符上限下限区分协变和逆变采取不同的转化方式
- 第01天实战技术(04):iOS9新特性之泛型(协变和逆变)