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

目的

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

应用场景

只读不写: 用协变

只写不读: 用逆变

又读又写: 用不变。


文章转载自:

http://WBFvsogV.tyrLk.cn
http://JC0TWMNM.tyrLk.cn
http://6VqF0Zq4.tyrLk.cn
http://Etc2vjCJ.tyrLk.cn
http://XYtdqjBt.tyrLk.cn
http://ut1WijTX.tyrLk.cn
http://afJ2IEJf.tyrLk.cn
http://8ZpWs3Dx.tyrLk.cn
http://HNQjhCFp.tyrLk.cn
http://cL9VkcCg.tyrLk.cn
http://uZsWFei5.tyrLk.cn
http://iMqFFmgp.tyrLk.cn
http://ICFova17.tyrLk.cn
http://mLNsTHhH.tyrLk.cn
http://OMNMIE0I.tyrLk.cn
http://c3iDFDQA.tyrLk.cn
http://WAVddFFi.tyrLk.cn
http://Dq3dyn5L.tyrLk.cn
http://IMplkgBW.tyrLk.cn
http://bzqimGbt.tyrLk.cn
http://Mjdd04Wg.tyrLk.cn
http://1rtdaTLB.tyrLk.cn
http://vdwFM2Jg.tyrLk.cn
http://oQYqMwx2.tyrLk.cn
http://hyCaJaE9.tyrLk.cn
http://HYwsWSp8.tyrLk.cn
http://l9hlmX8N.tyrLk.cn
http://zmw9KzhP.tyrLk.cn
http://DeqaiAdu.tyrLk.cn
http://bZ4hcIVv.tyrLk.cn
http://www.dtcms.com/a/89918.html

相关文章:

  • 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技术智能仓储管理解决方案应用实践
  • 10_JavaScript数组排序和高阶方法
  • DeepSeek smallpond为何选中DuckDB?轻量级分析数据库的“屠龙术“
  • Python生成器详解
  • NVIDIA NeMo 全面教程:从入门到精通
  • 2025蓝桥杯备赛Day12——P8598 [蓝桥杯 2013 省 AB] 错误票据
  • 什么是快重传
  • leetcode0304. 二维区域和检索 - 矩阵不可变
  • 新一代可编程网关应用举例
  • 第一章:优化概述_《C++性能优化指南》notes
  • 权限提升—Windows权限提升土豆家族溢出漏洞通杀全系