Java泛型的理解

news2024/11/15 11:07:23

前言

泛型是Java中一个比较重要的特性,是于JDK5引入新特性,其主要目的是为了提供编译时的类型安全检测机制和简化代码。本文主要探讨一下泛型的使用。

假如说没有泛型

假如说没有泛型,可以举一个例子:

ArrayList list = new ArrayList();
list.add("Hello");
list.add(123);
list.add(true);
list.add(3.14);
System.out.println(list);

假如说ArrayList没有泛型的限制,那么任意类型的数据都可以存放到ArrayList集合中,并且没有任何错误——看似还不赖,这样只需要创造一个集合就可以存放任何数据了,可是真的是这样吗?显然不是——假如说我们想要从集合中取出元素来使用,调用get方法,这时就会发现其弊端:

 

很显然,这段代码报错了,但是索引0处是有元素的,不存在索引越界问题;那应该就是类型不匹配的问题了,让我们细看一下报错的原因:

什么情况?按照上文的代码索引0处应该存储的元素是"hello",这应该是一个String类型的元素啊,为什么变成了Object类型的?这就要提到一个Java编译的特性了——类型擦除 :在Java中,泛型是在编译时处理的,编译器会在编译过程中移除所有的泛型类型信息,这个过程称为类型擦除。类型擦除的结果是,所有的泛型类型参数都会被替换为它们的上界(如果没有指定上界,则替换为Object),但是我们没有泛型,所以说就自动提升到Object了,所以说取出来的元素的类型是Object。

集合中存放多种类型数据的弊端

上文提到了在没有泛型的情况下,取出来的元素都是Object类型的,但是Object作为顶级父类,我们可以对它进行强制类型转换,转换成我们想要的数据类型——的确可以这么使用,但是假如说集合中存放了多种类型的数据,我们不得不根据不同数据的类型,写很多强制转换的代码,这未免也太不方便了;并且就算不嫌麻烦,愿意写很多强制类型转换的代码,但是还有一个致命的问题:

 

这个代码,我们把索引1的元素(int 123)强转为String的类型,本地IDE是没有报错的!假如我们不小心强制类型转换的时候写了错误的类型,编译器不会报错,只会把错误,留在运行时。

泛型的好处

所以说以上可以总结出两个不用泛型的弊端——安全性不足;使用集合等太过麻烦。所以说我们要使用泛型,它是为了为了提供编译时的类型安全检测机制和简化代码而产生的。它有两个主要的好处:1.把运行时期发生的问题提前到了编译的时期;2.避免了强制类型转换,所以说在使用集合等的时候,除非是特殊情况,不然就一定要使用泛型。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1996020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么把pdf转换成jpg图片免费?分享11款超实用的PDF转图片工具,工作效率直接拉满!

怎么把pdf转换成jpg图片?将PDF转换成图片,有多种方法可供选择,包括使用专业的PDF转换软件、在线转换工具,甚至电脑上有自带的转换方法。 pdf转图片的优势有很多,其中包括以下几点: 1、兼容性和可访性 转换…

Linux的platform设备驱动框架

platform其实就是linux中用来匹配设备和驱动的一种虚拟总线技术。之所以有这么个技术,是为了将驱动和设备分开来,设备负责描述设备信息,驱动负责实现功能逻辑。是一种分层思想下的产物。platform并不是局限于某一类设备,而是整个框…

鸿蒙(API 12 Beta3版)【视频解码】 音视频编码

开发者可以调用本模块的Native API接口,完成视频解码,即将媒体数据解码成YUV文件或送显。 当前支持的解码能力如下: 视频硬解类型视频软解类型AVC(H.264)、HEVC(H.265)AVC(H.264) 视频解码软/硬件解码存在差异,基于MimeType创建…

打造高品质短视频,四款好用的剪辑软件推荐!

作为一个热爱记录生活点滴的Vlogger,今天我想聊聊那些让我的视频剪辑之路变得轻松又有趣的剪辑软件。 福昕视频剪辑 链接:www.pdf365.cn/foxit-clip/ 首先,我要说的是福昕视频剪辑。它的界面设计非常人性化,让我可以一目了然地…

绝望者的希望——《这几年》

屈原在《离骚》里面说道:“路漫漫其修远兮,吾将上下而求索。”这句诗最有分量的两个字就是“求索”。许国忠的人生就是在用行动践行着这两个字。书作《这几年》正是他求索的轨迹。 他求索人间真情味。在书作里,我们大抵看到许国忠柔情的笔锋…

爬虫入门--了解相关工具

目录 1.爬虫与python 2.第一个爬虫 3.web请求的全过程 3.1服务器渲染 3.2前端JS渲染 4.浏览器工具 4.1Elements 4.2Console 4.3Source 4.4network(重点) 5.小结 1.爬虫与python 首先我们要知道,爬虫一定要用Python么? 非也~…

运算放大器电气测试中的典型参数

为了评估与空间应用相关的某些应力源的影响,在运算放大器的电气测试过程中会测量一组电气参数。以下是运算放大器中常用的典型参数。 尽管理想情况下,运放在输入端没有电流,输入和输出没有失调,增益无限,速度无限&…

环境配置:如何在IntelliJ IDEA中安装和修改JDK版本配置(以Windows为例)

环境配置:如何在IntelliJ IDEA中安装和修改JDK版本配置(以Windows为例) 为了在Java开发中使用最新的功能和优化,升级和配置JDK版本是必不可少的。本文将详细介绍如何下载、安装、配置最新的JDK版本,并在IntelliJ IDEA…

04_Electron 模块介绍

Electron 模块介绍 一、Electron 主进程和渲染进程中的模块(介绍)二、Electron remote 模块三、Electron 渲染进程中通过 remote 模块调用主进程中的 BrowserWindow 打开新窗口1、安装 electron/remote2、主进程中配置启用 remote 模块3、渲染进程引入 r…

大模型应用开发的框架

一、大语言模型的几个框架 1、python的版本langchain LangChain英文官方地址:https://www.langchain.com/ LangChain中文官网:https://www.langchain.com.cn/ Python官方地址:https://python.langchain.com/en/latest/ LangChain源代码地…

使用 Seurat 处理多模态数据

文章目录 前言一、Multimodal analysis有什么用?二、代码复现1.数据的导入2.构建seurat对象,并添加RNA和protein数据3.根据其单细胞 RNA 测序(scRNA-seq)图谱对细胞进行聚类4.并排可视化多种模态4.1.1可视化RNA和蛋白质水平,这里检测的基因CD19在蛋白质…

【博客搭建 第二篇章】项目中怎么引入其他的 icon

一、注册账号并将图标添加到自己的项目中 1、网站地址:https://www.iconfont.cn/ 2、注册 iconfont 账号 3、登录 iconfont 网站中 4、添加图标到购物车中 5、添加图标到项目中 6、生成在线连接 7、复制连接 二、项目中配置连接地址 找到项目中的 them…

嵌入式初学-C语言-十九

指针的引入 为函数修改实参提供支持为动态内存管理提供支持为动态数据及结构提供支持为内存访问提供另一种途径 指针的概述 内存地址: 系统为了内存管理的方便将内存划分为一个个内存单元(一个内存单元占一个字节),并为每一个…

YARN 调度器的配置与使用

YARN 调度器的配置与使用 一、启动公平调度器1.1 配置 yarn-site.xml创建 fail-scheduler.xml 文件 二、同步配置文件三、重启启动 YARN 集群四、提交作业五、运行结果 一、启动公平调度器 公平调度器的使用由属性yarn.resourcemanager.scheduler.class的设置所决定。YARN默认…

Effective Java学习笔记第27、28条原生态类型和非受检警告

目录 什么是泛型 泛型与编译器 不要轻易使用原生态类型 可以通过通配符类型来替代原生态类型 几个适合原生态类型的场景 消除非受检的警告 什么是非受检警告 如果无法消除警告 本书27-33条主要介绍泛型。首先介绍什么是泛型,它的应用场景是什么。然后重点介…

微信小程序项目-宠物商城项目uniapp源码和代码讲解

🤹‍♀️潜意识起点:个人主页 🎙座右铭:得之坦然,失之淡然。 💎擅长领域:大前端 是的,我需要您的: 🧡点赞❤️关注💙收藏💛 是我…

3D渲染优化:视锥体剔除算法

现在我们知道如何创建场景图并在场景中组织对象,我们将了解如何通过技术“视锥剔除”来限制 GPU 的使用。 这种技术很容易理解。你无需将所有信息发送到 GPU,而是对可见和不可见元素进行排序,并仅渲染可见元素。借助这种技术,你将…

Matlab|考虑充电负荷空间可调度特性的分布式电源与电动汽车充电站联合配置方法

目录 1 主要内容 目标函数 电动汽车负荷建模 算例系统图 程序亮点 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现博士文章《互动环境下分布式电源与电动汽车充电站的优化配置方法研究》第四章《考虑充电负荷空间可调度特性的分布式电源与电动汽车充电站联合…

Baklib:强大的知识库创建工具

Baklib:强大的知识库创建工具 在信息管理和知识分享的数字化时代,Baklib 作为一款功能强大的知识库创建工具,为用户提供了全面的解决方案。本文将介绍 Baklib 的基本信息、特点,以及如何快速部署和使用。 软件简介 Baklib 是一款…

第二十节、有限状态机和抽象类多态

一、抽象类 挂载到动画器上的就是继承抽象类代码 1、使用onenable周期函数启用 2、在每一个周期函数中对抽象类进行调用 3、隐藏公开的变量