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

泛型11.16

泛型

①泛型是Java5的新特性,属于编译阶段的功能。

②泛型可以让开发者在编写代码时指定集合中存储的数据类型

③泛型作用:

1.类型安全:指定了集合中元素的类型之后,编译器会在编译时进行类型检查,如果尝试将错误类型的元素添加到集合中,就会在编译时报错,避免了在运行时出现类型错误的问题。

2.代码简洁:使用泛型可以简化代码,避免了繁琐的类型转换操作。比如,在没有泛型的时候,需要使用 Object 类型来保存集合中的元素,并在使用时强制类型转换成实际类型,而有了泛型之后,只需要在定义集合时指定类型即可。

④在集合中使用泛型

Collection<String> strs = new ArrayList<String>();

这就表示该集合只能存储字符串,存储其它类型时编译器报错。

并且以上代码使用泛型后,避免了繁琐的类型转换,集合中的元素可以直接调用String类特有的方法。

⑤Java7的新特性:钻石表达式

Collection<String> strs = new ArrayList<>();

泛型的擦除与补偿(了解)

①泛型的出现提高了编译时的安全性,正因为编译时对添加的数据做了检查,则程序运行时才不会抛出类型转换异常。因此泛型本质上是编译时期的技术,是专门给编译器用的。加载类的时候,会将泛型擦除掉(擦除之后的类型为Object类型),这个称为泛型擦除。

②为什么要有泛型擦除呢?其本质是为了让JDK1.4和JDK1.5能够兼容同一个类加载器。在JDK1.5版本中,程序编译时期会对集合添加的元素进行安全检查,如果检查完是安全的、没有错误的,那么就意味着添加的元素都属于同一种数据类型,则加载类时就可以把这个泛型擦除掉,将泛型擦除后的类型就是Object类,这样擦除之后的代码就与JDK1.4的代码一致。

③由于加载类的时候,会默认将类中的泛型擦除为Object类型,所以添加的元素就被转化为Object类型,同时取出的元素也默认为Object类型。而我们获得集合中的元素时,按理说取出的元素应该是Object类型,为什么取出的元素却是实际添加的元素类型呢?

④这里又做了一个默认的操作,我们称之为泛型的补偿。在程序运行时,通过获取元素的实际类型进行强转,这就叫做泛型补偿(不必手动实现强制转换)。获得集合中的元素时,虚拟机会根据获得元素的实际类型进行向下转型,也就是会恢复获得元素的实际类型,因此我们就无需手动执行向下转型操作,从本质上避免了抛出类型转换异常。


http://www.kler.cn/a/397774.html

相关文章:

  • 第二十一周机器学习笔记:动手深度学习之——数据操作、数据预处理
  • v-html 富文本中图片使用element-ui image-viewer组件实现预览,并且阻止滚动条
  • Python 打包教程:从零开始构建可分发的Python包
  • SpringBoot 应用出错 Comparison method violates its general contract!
  • Spring Boot框架:电商系统的技术革新
  • 数据结构-二叉树及其遍历
  • “倒时差”用英语怎么说?生活英语口语学习柯桥外语培训
  • 30-集群Backup Restore
  • 【#IEEE独立出版、EI稳定检索##高录用 快见刊 稳检索#】2024健康大数据与智能医疗国际会议(ICHIH 2024,12月13-15日)
  • 【Java知识】Java性能测试工具JMeter
  • node.js下载安装步骤整理
  • Linux基础5-进程控制1(fork创建子进程,写时拷贝,进程退出)
  • nuget 管理全局包、缓存和临时文件夹
  • Zotero 7本地pdf文件名自适应中英文格式
  • stm32使用cJSON_Print返回空
  • Gin 框架入门(GO)-1
  • 正态分布密度函数的基本概念
  • Pandas进行时间选择与过滤
  • vue3设置第三方组件 样式::v-deep
  • 智能化运维与AI/ML辅助决策:实现自动化与预测优化
  • 游戏引擎学习第八天
  • 【Java】异常处理实例解析
  • c# 调用c++ 的dll 出现找不到函数入口点
  • Java 核心技术卷 I 学习记录六
  • Scala中的Array
  • 基于树莓派的边缘端 AI 目标检测、目标跟踪、姿态估计 视频分析推理 加速方案:Hailo with ultralytics YOLOv8 YOLOv11