java泛型的协变、逆变和不变
引言
我们在看开源框架经常会看到泛型来定义数据类型。
有时候, <? extends T> 和 <? super T> 这样带通配符的泛型参数。
这种通配符的泛型是什么意思怎么用????
概念
型变: 用来描述类型转换后的继承关系。(即协变,逆变和不变的总称)
协变: 满足 条件 : 例子 list<orange> 是 list<? extends Fruits> 的子类型时,称为协变。
逆变: 满足条件 : 例子 List<fruits> 是 List <? super Orange > 的子类型时,称之为逆变。
带通配符的泛型是什么意思?
这是因为java 泛型本身不支持型变,因此引入通配符来解决泛型类型转换问题。
通用表达式:
C <? extends T> 表示类型转换的上界。
C<? super T >. 表示类型转换的下界。
上界和下界的理解?
在java中泛型加入了extends 关键字 实现了支持协变。<? extends T > 其中?代表不确定的类型的通配符, 和extends 结合就声明了泛型的上限 表示 接收类型是 T或者 T的子类。
使用 super 关键字,实现了支持逆变 。声明泛型下界 , <? super T > 逆变后就可以接收本类型或父类型的泛型类。
如果直接指定 T会有什么问题?
直接使用 T 不会有问题,但会限制函数接口的灵活性导致框架的通用性降低。
目的
型变的最终目的是保证运行安全的基础上提高了参数类型的灵活性。
应用场景
只读不写: 用协变
只写不读: 用逆变
又读又写: 用不变。