java泛型1

news2024/11/15 12:16:07

泛型(为了集合)
Java 5增加泛型支持在很大程度上都是为了让集合能记住其元素的数据类型。在没有泛型之前,一旦把一个对象“丢进”Java集合中,集合就会忘记对象的类型,把所有的对象当成Object类型处理。当程序从集合中取出对象后,就需要进行强制类型转换,这种强制类型转换不仅使代码臃肿,而且容易引起ClassCastExeception异常。
增加了泛型支持后的集合,完全可以记住集合中元素的类型,并可以在编译时检查集合中元素的类型,如果试图向集合中添加不满足类型要求的对象,编译器就会提示错误。增加泛型后的集合,可以让代码更加简洁,程序更加健壮(Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常)。除此之外,Java泛型还增强了枚举类、反射等方面的功能。java泛型具体都用做什么呢?通过泛型来实现编译时检查集合元素的类型,而且会深入介绍Java泛型的详细用法,包括定义泛型类、泛型接口,以及类型通配符、泛型方法等知识。
Java集合之所以被设计成这样,是因为集合的设计者不知道我们会用集合来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对象,只要求具有很好的通用性。但这样做带来如下两个问题:
1.集合对元素类型没有任何限制,这样可能引发一些问题。例如,想创建一个只能保存Dog对象的集合,但程序也可以轻易地将Cat对象“丢”进去,所以可能引发异常。
2.由于把对象“丢进”集合时,集合丢失了对象的状态信息,集合只知道它盛装的是Object,因此取出集合元素后通常还需要进行强制类型转换。这种强制类型转换既增加了编程的复杂
度,也可能引发ClassCastException异常。
使用泛型 从 Java 5 以 后,Java 引入了 “ 参数化类型( parameterized type)”的概念,允许程序在创建集合时指定集合元素的类型,Java的参数化类型被称为泛型(Generic)。
在这里插入图片描述
上面程序成功创建了一个特殊的List集合:strList,这个List集合只能保存字符串对象,不能保存其他类型的对象。创建这种特殊集合的方法是:在集合接口、类后增加尖括号,尖括号里放一个数据类型,即表明这个集合接口、集合类只能保存特定类型的对象。可以称此时的List是带一个类型参数的泛型接口,在本例中,类型参数是String。在创建这个ArrayList对象时也指定了一个类型参数。上面程序将在②处引发编译异常,因为strList集合只能添加String对象,所以不能将Integer对象“丢进”该集合。而且程序在③处不需要进行强制类型转换,因为strList对象可以“记住”它的所有集合元素都是String类型。
上面代码不仅更加健壮,程序再也不能“不小心”地把其他对象 “丢进”strList集合中;而且程序更加简洁,集合自动记住所有集合元素的数据类型,从而无须对集合元素进行强制类型转换。这一切都是因为Java 5提供的泛型支持。
进一步,看着好像比较麻烦,Java 9增强的“菱形”语法,在Java 7以前,如果使用带泛型的接口、类定义变量,那么调用构造器创建对象时构造器的后面也必须带泛型,这显得有些多余了,例如如下两条语句粗体字代码部分完全是多余的:
在这里插入图片描述
在这里插入图片描述
从Java 7开始,Java允许在构造器后不需要带完整的泛型信息,只要给出一对尖括号(<>)即可,Java可以推断 尖括号里应该是什么泛型信息:把两个尖括号并排放在一起非常像一个菱形,这种语法也就被称为“菱形”语法。下面程序示范了Java 7及以后版本的菱形语法。
“菱形”语法对原有的泛型并没有改变,只是更好地简化了泛型编程。需要说明的是,当使用var声明变量时,编译器无法推断泛型的类型。因此如果使用var声明变量,程序无法使用“菱形”语法。Java 9再次增强了“菱形”语法,它甚至允许在创建匿名内部类时使用菱形语法,Java可根据上下文来推断匿名内部类中泛型的类型。下面程序示范了在匿名内部类中使用菱形语法。
在这里插入图片描述
上面程序先定义了一个带泛型声明的接口,接下来三行粗体字代码分别示范了在匿名内部类中使用菱形语法。
第一行粗体字代码声明变量时明确地将泛型指定为String类型,因此在该匿名内部类中T类型就代表了String类型;
第二行粗体字代码声明变量时使用通配符来代 表泛型(相当于通配符的上限为Object),因此系统只能推断出T代表Object,所以在该匿名内部类中T类型就代表了Object类型;第三行粗 体字代码声明变量时使用了带上限(上限是Number)的通配符,因此系统可以推断出T代表Number类。无论哪种方式,Java 9都允许在使用匿名内部类时使用菱形语
法。

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

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

相关文章

基于深度学习框架设计的货运管家(功能总结)

项目背景&#xff1a; 在快递行业发达的今天&#xff0c;有数不胜数的货运公司、快递公司&#xff0c;这些公司都有自己的运输车辆&#xff0c;请师傅开车送货。 比如&#xff1a;快递公司、烟草运输公司、货物运输公司等等。 为了能方便管理货车&#xff0c;了解车辆行驶路线…

49.Isaac教程--Cartographer

Cartographer ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录Cartographer数据要求配置启动 Cartographer 示例应用程序监控和可视化输出Cartographer 是 Google 的一个&#xff08;同步定位和映射&#xff09;SLAM 系统&#xff0c;能够…

2023最新前端面试题5(持续更新)

Vue 74、vue 生命周期 74.1、什么是 Vue 生命周期? Vue 实例从创建到销毁的过程&#xff0c;就是生命周期。也就是从开始创建、初始化数据编译模板、挂载 Dom一渲染、更新一渲染、卸载等一系列过程&#xff0c;我们称这是 Vue的生命周期 74.2、Vue 生命周期的作用是什么?…

函数递归+青蛙跳台阶——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容终于要回到我们的C语言了&#xff0c;在之前&#xff0c;我写函数这篇博客的时候就讲过&#xff0c;会把函数递归的内容单独拿出来&#xff0c;然后呢当时是说下一篇博客就会更函数递归和青蛙跳台阶&#xff0c;由于一系列原…

拼多多控价,低价投诉,不被支持怎么办

治理电商平台上的低价乱价链接&#xff0c;首选方法是沟通调整&#xff0c;成本低、见效快。针对沟通调整不成功的&#xff0c;再进行平台投诉&#xff0c;通过电商平台的力量对其进行约束。 但是&#xff0c;平台投诉一定要注意一点&#xff1a;不要以低价为理由&#xff01;…

原命题和逆否命题

看Boyd的凸优化看到这样一个证明&#xff1a; 从左到右的证明是 使用了一个逆否命题的方法进行证明&#xff0c;有点忘记了原命题和逆否命题之间的相互转换&#xff0c;记录一下。 简单形式命题 简单形式命题没有全称量词∀\forall∀和存在两次∃\exists∃&#xff0c;也没有…

字符流、字节流、缓冲流、序列化流

1.文件拷贝的基本代码 2.一次读取多个字节 3.异常处理 但是上述的释放过程太繁琐&#xff0c;于是便用AutoCloseable接口简化释放过程 JDK7: JDK9: 4.各种字词计算机存储规则 所以底层二进制文件就是根据正负来区别英文和中文的。 5.乱码 6.字符流 7.字符输入流和输出流底层原理…

ASEMI桥式整流电路KBP206特性参数的计算

编辑-Z 什么是桥式整流电路&#xff1f; 桥式整流电路由四个二极管以闭环“桥式”配置连接&#xff0c;以产生所需的输出。这种桥式电路的主要优点是不需要特殊的中央抽头变压器&#xff0c;从而减小了尺寸和成本。单个次级绕组连接到二极管桥网络的一侧&#xff0c;负载连接到…

【正点原子FPGA连载】第二十一章根文件系统构建 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十一章根文件…

ch3_1系统总线的概念

1. 总线的基本概念 总线概念&#xff1a; 是连接各个部件的信息传输线&#xff0c;是各个部件共享的传输介质&#xff1b; 1.1 为何需要总线 总线结构便于增减 外设&#xff0c; 同时 减少了信息传输线的条数。 总线是信号的公共传输线&#xff0c; 1.2 总线上信息的传送 …

深入理解堆与优先队列

目录一、什么是堆&#xff1f;二、堆的实现2.1 上滤与下滤2.2 堆的常用操作2.3 建堆三、堆排序四、优先队列References一、什么是堆&#xff1f; 堆&#xff08;Heap&#xff09;是一种特殊的完全二叉树&#xff0c;满足性质&#xff1a;除叶节点外每个节点的值都大于等于&…

【Window 入侵排查】

Window 入侵排查1、文件的排查1.1 开机启动有无异常文件启动1.2 对系统敏感文件路径的查看1.3 查看Recent1.4 查看文件时间1.5 webshell 文件排查2、进程、端口排查2.1 查看进程2.2 进程排查2.3 使用powershell 进行查询2.4 使用WMIC 命令进行排查3、检查启动项、计划任务、服务…

全志V85X系列芯片PCB设计需要注意些什么?

全志V85X &#xff08;包括V853、V853S、V851S、V851SE等&#xff09;是一颗面向智能视觉领域推出的新一代高性能、低功耗的处理器SOC&#xff0c;可广泛用于智能门锁、智能考勤门禁、网络摄像头、行车记录仪、智能台灯等智能化升级相关行业。V85X 集成ARM Cortex-A7和RISC-V E…

一个跨平台执行外部命令的C#开源库

更多开源项目请查看&#xff1a;一个专注推荐.Net开源项目的榜单 对于我们程序员来说&#xff0c;在日常开发项目中&#xff0c;调用外部的命令是非常常见的&#xff0c;比如调用批处理命令、调用其他应用&#xff0c;这里面就涉及到进程的通讯、管理、启动、取消等一些操作&am…

Spring Native打包本地镜像,无需通过Graal的maven插件buildtools

简介 在文章《GraalVM和Spring Native尝鲜&#xff0c;一步步让Springboot启动飞起来&#xff0c;66ms完成启动》中&#xff0c;我们介绍了如何使用Spring Native和buildtools插件&#xff0c;打包出本地镜像&#xff0c;也打包成Docker镜像。本文探索一下&#xff0c;如果不通…

一文细说Linux Out Of Memory机制

有时候我们会发现系统中某个进程会突然挂掉&#xff0c;通过查看系统日志发现是由于 OOM机制 导致进程被杀掉。 今天我们就来介绍一下什么是 OOM机制 以及怎么防止进程因为 OOM机制 而被杀掉。 什么是OOM机制 OOM 是 Out Of Memory 的缩写&#xff0c;中文意思是内存不足。而…

【CLYZ集训】人人人数【数学】

思路&#xff1a; 先转转转&#xff0c;把答案变成求每种数的出现次数都小于i的方案书除以Cnm−1mC_{n m - 1}^{m}Cnm−1m​ 对于每个1到m中的数&#xff0c;设每个数的出现次数为xi&#xff0c;则所有x加起来要等于m&#xff0c;且都小于i。 容斥&#xff0c;设其中k个不小于…

目标检测算法——YOLOV8——算法详解

一、主要贡献 主要的创新点&#xff1a;其实到了YOLOV5 基本创新点就不太多了&#xff0c;主要就是大家互相排列组合复用不同的网络模块、损失函数和样本匹配策略。 Yolo v8 主要涉及到&#xff1a;backbone 使用C2f模块&#xff0c;检测头使用了anchor-free Decoupled-head&a…

HTB_Unified_log4j_jndi注入mongodb修改用户hash

文章目录信息收集漏洞复现漏洞验证漏洞利用提权信息收集 nmap -sV -v 这次扫描时间很长&#xff0c;因为默认只扫 1000 个常用端口&#xff0c;如果扫到大端口就会自动扫描全端口&#xff0c;可以自行加速 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (…

Markdown语法-从基础到进阶

时代在进步&#xff0c;越来越多的人和软件开始使用Markdown进行文字编辑&#xff0c;其编辑方便性让很多人爱不释手。但是&#xff0c;不可避免的问题是&#xff0c;在编辑的时候&#xff0c;经常会需要去google,毕竟&#xff0c;习惯了office的可视化操作符号&#xff0c;很多…