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 不会有问题,但会限制函数接口的灵活性导致框架的通用性降低。

目的

型变的最终目的是保证运行安全的基础上提高了参数类型的灵活性。

应用场景

只读不写: 用协变

只写不读: 用逆变

又读又写: 用不变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值