当前位置: 首页 > news >正文

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

目的

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

应用场景

只读不写: 用协变

只写不读: 用逆变

又读又写: 用不变。

相关文章:

  • 3、pytest实现参数化
  • 架构设计-springboot和springcloud的使用场景与区别
  • 【数组】螺旋矩阵
  • 图解AI对话系统架构:一次讲透核心技术
  • 【读点论文】Object Storage on CRAQ
  • 2025最新-智慧小区物业管理系统
  • Excel多级联动下拉菜单的自动化设置(使用Python中的openpyxl模块)
  • 汤臣倍健业绩倒车:2024年利润下滑超六成,三大核心品牌销量失守
  • acwing112:三种排序方法解决组合排序问题
  • 【杂记三】Cython加速模块cython_nms未编译
  • 无人机数据处理系统设计要点与难点!
  • Linux输入系统应用编程
  • 短信验证码安全需求设计
  • 游戏引擎学习第182天
  • # 03_Elastic Stack 从入门到实践(三)-- 2
  • gulimall知识点
  • multi paxos协议
  • Python爬虫获取1688商品(按图搜索)接口的返回数据说明
  • HTTP 协议中请求与响应的详细解析
  • RFID技术智能仓储管理解决方案应用实践
  • p2p网站开发费用/网站排名优化软件哪家好
  • 枣庄市市中区建设路网站/电商运营培训课程
  • 后台管理网站开发/中国婚恋网站排名
  • 就业seo好还是sem/厦门谷歌seo
  • 有做ppt的兼职网站吗/软文广告范例大全
  • 用什么做网站后台的/搜索引擎推广的常见形式有