Kotlin 泛型

159 阅读1分钟

多态(Polymorphic) 有三种组成部分:

特殊多态(ad hoc polymorphism)包含 函数重载(function overloading),类型转换多态(coercion polymorphism)

参数化多态(parameteric polymorphism), 泛型

子类型多态(subtyping polymorphism) 类继承


引入泛型的目的

强化对类型的编译期的类型检查,减少编程错误。所以泛型反而是一种保护和限制。


Java 与 Kotlin 的泛型支持

Java 和 Kotlin 实现泛型是通过类型擦除的方式实现。此外还有另一类泛型实现方式,类型复制的方式,比如C++,但是会带来类型膨胀问题。没有明显的优劣。

类型系统

型变(Variant):协变(Covariant),逆变(Contravariant),不变(Invariant)

Java/Kotlin 数组是天然支持协变的,也即使父类型的数组也是子类型数组的父类型,而泛型是不变的,协变和逆变不是天然支持,需要通过类型通配符来解决,但是依然有限制

Java 类型通配符 Type Wildcard

?extends T 协变 out

? super T 逆变  in

也就是PECS:  producer-extends, consumer-super

PECS 也被称为 Get and Put Principle

泛型的使用分两种: 一种是声明泛型,一种是使用泛型