多态(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
泛型的使用分两种: 一种是声明泛型,一种是使用泛型