版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java程序设计语言概述15.1泛型01
泛型01泛型Java泛型是JDK5引入的核心特性,通过参数化类型实现了代码模板化。其核心思想是在定义类、接口或方法时声明类型占位符(如<T>),使用时指定具体类型,从而实现类型安全的代码复用。例如List<String>明确约束集合元素为字符串类型,编译器自动进行类型检查,避免向集合添加非法类型数据,从根源上消除类型转换错误。
该机制显著提升代码质量:编译时类型检查取代运行时强制转换,减少ClassCastException风险;消除冗余的类型转换代码,提升可读性;增强代码复用性,同一段逻辑可服务于多种数据类型。通过extends和super通配符还能实现更精细的类型控制,如List<?extendsNumber>限定元素为数字类型及其子类,平衡灵活性与安全性。泛型已成为Java开发中构建健壮、可维护系统的必备工具。
泛型的主要应用场景集中在三个方面:其一,集合框架标准化,所有Java容器类通过泛型确保存取元素时的类型一致性,如Map<Integer,String>清晰定义键值类型;其二,工具类通用化,创建可处理多种数据类型的工具方法,如泛型方法<T>TgetData(Tinput)既能处理字符串也能处理数值;其三,API接口灵活化,设计通用组件时通过泛型约定输入输出类型规范,如Comparator<T>接口支持任意对象的比较逻辑。01泛型Java泛型类是通过类型参数定义的模板化类,允许在创建对象时指定具体类型,从而增强代码的类型安全性和复用性。定义时在类名后添加<T>,T为类型占位符、类型参数,定义类型参数后可以在之后的类的几乎任何地方使用该类型参数。例如://泛型类定义publicclassBox<T>{…privateTcontent;publicvoidset(Titem){this.content=item;}publicTget(){returncontent;}}1泛型类01泛型创建泛型对象时需指定具体类型,编译器会根据类型参数进行约束。语法如下:类名<具体类型>对象名=new类名<>();示例:Box<String>strBox=newBox<>();//只能存放字符串strBox.set("Hello");//✅
合法strBox.set(100);//❌
编译报错:类型不匹配Box<Integer>intBox=newBox<>();//只能存放整数intBox.set(100);//✅
合法01泛型
泛型方法通过在方法返回值前声明类型参数(如<T>)实现,允许方法独立于类或接口的泛型定义,单独支持不同类型操作。泛型方法通过独立类型参数声明,实现对不同类型数据的统一逻辑处理,兼具类型安全与代码复用性。其核心价值在于消除强制转换(如集合操作)、支持通用算法实现(如排序、比较)。public<T>返回值类型
方法名(T参数){//方法体}
泛型方法的类型参数作用域仅限于方法内部,与类的泛型参数无关;调用时无需显式指定类型,编译器根据参数自动推断类型。例如:publicstatic<T>TgetFirst(T[]array){//声明泛型方法returnarray[0];}Stringstr=getFirst(newString[]{"a","b"});//泛型方法调用2泛型方法01泛型
泛型接口通过在接口名后添加类型参数(用尖括号<>括起来)来定义。类型参数可以是任意标识符,通常使用单个大写字母(如T、E、K、V等)。在接口中,可以使用这些类型参数作为方法参数类型或返回值类型。这些类型参数在接口的实现时被具体化。语法如下:publicinterface接口名<T>{T方法名(T参数);//接口方法使用泛型类型作为参数或返回值
}一个简单的泛型接口实例如下:publicinterfaceConverter<T>{Tconvert(Tinput);//将输入类型T转换为输出类型T}publicclassStringConverterimplementsConverter<String>{@OverridepublicStringconvert(Stringinput){returninput.toUpperCase();//仅处理字符串类型}}3泛型接口01泛型4泛型的相关概念(1)泛型通配符泛型通配符是Java泛型中的一个重要概念,用于表示未知或不确定的类型参数。泛型通配符主要有三种形式:无边界通配符、固定上边界通配符和固定下边界通配符。01泛型
表示任意类型。使用无边界通配符的泛型方法可以接受任何类型的参数。适用于不关心具体类型或需兼容多种类型的场景。无边界通配符使用的一个简单示例如下:无边界通配符(<?)importjava.util.List;importjava.util.Arrays;publicclassUnboundedWildcardDemo{//定义泛型方法:打印任意类型的List内容publicstaticvoidprintList(List<?>list){for(Objectelement:list){//元素以Object类型读取System.out.print(element+"");}System.out.println();}//定义泛型方法:向List中添加null(唯一允许的写入操作)publicstaticvoidaddNullElement(List<?>list){list.add(null);//✅
允许添加null//list.add("Java");//❌
编译错误:无法确定具体类型}publicstaticvoidmain(String[]args){//使用示例List<String>stringList=Arrays.asList("Hello","World");List<Integer>intList=Arrays.asList(1,2,3);//调用泛型方法(无需类型转换)printList(stringList);//输出:HelloWorldprintList(intList);//输出:123//验证添加null操作List<Double>doubleList=newArrayList<>();addNullElement(doubleList);printList(doubleList);//输出:null}}01泛型
固定上边界通配符(<?extendsT)表示某个类的子类或该类本身。这种通配符增强了类型的安全性,因为它限制了可以接受的类型范围。适用于需要安全读取数据但不修改数据的场景(如遍历集合元素);禁止添加非null元素(编译器无法确定具体子类)。示例如下:固定上边界通配符(<?extendsT)importjava.util.List;importjava.util.Arrays;publicclassUpperBoundWildcardDemo{//定义泛型方法:计算数值类型列表的总和(支持Number及其子类)publicstaticdoublesumOfList(List<?extendsNumber>list){doublesum=0.0;for(Numbernum:list){//元素可直接作为Number类型读取sum+=num.doubleValue();}returnsum;}//定义泛型方法:尝试添加元素(验证写入限制)publicstaticvoidaddElement(List<?extendsNumber>list){//list.add(10);//❌
编译错误:无法确定具体子类类型//list.add(3.14);//❌
编译错误list.add(null);//✅
允许添加null}publicstaticvoidmain(String[]args){//使用示例List<Integer>intList=Arrays.asList(1,2,3);List<Double>doubleList=Arrays.asList(1.5,2.5,3.5);//调用泛型方法(自动兼容不同子类)System.out.println("整数列表总和:"+sumOfList(intList));//输出6.0System.out.println("浮点数列表总和:"+sumOfList(doubleList));//输出7.5//验证写入操作限制List<Number>numberList=newArrayList<>();addElement(numberList);//仅能添加nullSystem.out.println("添加null后的列表:"+numberList);//输出[null]}}01泛型
固定下边界通配符(<?superT)表示某个类的父类或该类本身。这种通配符允许更灵活的操作,因为它允许接受更广泛的类型。适用于需要安全写入数据但允许灵活读取的场景(如向集合中添加元素)。示例如下:固定下边界通配符(<?superT)importjava.util.List;importjava.util.ArrayList;publicclassLowerBoundWildcardDemo{//定义泛型方法:向集合中添加Integer对象(支持Integer及其父类容器)publicstaticvoidfillIntegers(List<?superInteger>list){list.add(10);//✅
允许添加Integer类型list.add(20);//list.add(3.14);//❌
编译错误:Double不是Integer或其父类}//定义泛型方法:尝试读取元素(验证读取限制)publicstaticvoidprintFirstElement(List<?superInteger>list){Objectfirst=list.get(0);//只能以Object类型读取System.out.println("第一个元素(Object类型):"+first);}publicstaticvoidmain(String[]args){//使用示例List<Number>numberList=newArrayList<>();fillIntegers(numberList);//✅
允许操作Number父类容器System.out.println("填充后的Number列表:"+numberList);//输出[10,20]List<Object>objectList=newArrayList<>();fillIntegers(objectList);//✅
允许操作Object父类容器System.out.println("填充后的Object列表:"+objectList);//输出[10,20]//验证读取限制printFirstElement(numberList);//输出:第一个元素(Object类型):10}}01泛型泛型擦除是Java泛型实现的一种机制,其核心思想是在编译过程中移除泛型类型信息,使得泛型代码在运行时与非泛型代码具有相同的表现形式。具体来说,在编译过程中,Java编译器会将所有的泛型类型参数(如<T>)替换为其边界类型(如果有边界)或Object类型。这个过程被称为类型擦除。
泛型擦除的主要目的是为了保持向后兼容性和简化JVM设计,同时允许泛型以一种类型安全的方式被使用。尽管泛型信息在运行时被擦除,但编译时的类型检查确保了代码的类型安全性
尽管泛型信息在编译时被擦除,但Java编译器会在编译时进行严格的类型检查,确保类型安全。这意味着在编译时可以捕获类型不匹配的错误,从而避免运行时出现ClassCastException等异常。泛型擦除机制保证了与旧版本Java代码的兼容性,并简化了JVM的设计。(2)擦除01泛型泛型是什么?通俗版解释:泛型就像「分类收纳盒」想象你网购了一个万能储物箱,卖家说:「这个箱子能装任何东西!」。于是你用它装过:玩具
、书本
、零食
问题来了:每次打开箱子拿东西时,你都要先猜里面是什么,可能发生意外://非泛型的箱子(什么都能装)Objectbox=newCat();//实际装了一只猫Stringitem=(String)box;//取出时强制转成字符串
→
崩溃!泛型解决方案:给箱子贴标签01泛型场景1:类型明确的容器给储物箱贴上类型标签,就像分类收纳://泛型盒子(明确标注存放类型)Box<String>bookBox=newBox<>();//标签:仅限书籍bookBox.put("红楼梦");//✅
正确bookBox.put(100);//❌
编译直接报错(像收纳师阻止你乱放)…Stringbook=bookBox.get();//取出时自动是书籍,不用猜01泛型场景2:通用工具模板比如设计一个「称重器」,可以称水果、蔬菜,但不想为每种食材单独造机器://泛型方法:自动识别物体类型<T>voidweigh(Titem){Sys
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学五年级科学上册《杠杆》探究式教学设计
- 2026轻奢服饰品牌运营分析客户拉动增长决策研究报告
- 小学三年级下册综合实践活动教学设计-走进社区公共设施学做小小提案人
- 高一化学必修第二册第一章原子结构元素周期律知识清单教学设计
- 2026年多重耐药菌医院感染预防与控制培训试题(附答案)
- 医院医保办工作计划
- 2025年污染防治专员招聘试题(附答案)
- 建筑工地应急演练计划
- 老旧小区供水系统改造设计方案
- 室内精装修机电安装施工方案
- 铁路劳动安全 课件 第三篇 季节性劳动安全
- JGJT46-2024《施工现场临时用电安全技术标准》条文解读
- 教学常规管理培训课件
- 水闸重建施工组织设计
- 新湘教版九年级上册数学教案(全册)
- 化工装置开车前安全检查
- 国企招聘中层干部笔试题库
- 医院院内感染培训
- 驾照体检表完整版本
- 植物学试题和答案
- GB/T 5202-1985α,β和α-β表面污染测量仪与监测仪
评论
0/150
提交评论