JavaSE——面向对象高级三(5/5)-泛型方法、泛型的通配符、泛型擦除和注意事项

目录

泛型方法

泛型的通配符

泛型擦除和注意事项


泛型方法

修饰符 <类型变量,类型变量,...> 返回值类型 方法名(形参列表){

}

public static <T> void test(T t){}

注意:下面这种不是泛型方法

public E get(int index){return (E) arr[index];
}

 具体体现:

public class Test{public static void main(String[] args){test(new Dog()); //假设传入了狗对象}//泛型方法public static <T> T test(T t){  //返回值类型也为T类型return t;}
}

泛型的通配符

来看一个需求:所有汽车一起参加比赛,需要汽车类、具体的汽车品牌类,然后设计方法只能让汽车一起比赛。

现在假设已经定义了Car、BMW、BENZ类。

第一种情况:(定义总体的汽车集合,将各种汽车都放进这个集合里面)

public class Test{public static void main(String[] args){ArrayList<Car> cars = new ArrayList<>(); //创建一个汽车集合//我们可以将一辆奔驰和宝马放进这个汽车集合里面cars.add(new BMW());cars.add(new BENZ());//然后调用比赛的函数,没有什么问题go(cars);}public static void go(ArrayList<Car> cars){}
}

第二种情况:(定义不同的具体汽车集合,例如宝马车为一个集合,奔驰车为一个集合)

public class Test{public static void main(String[] args){ArrayList<Car> cars = new ArrayList<>(); //创建一个汽车集合ArrayList<BMW> bmws = new ArrayList<>(); //创建宝马车集合bmws.add(new BMW());bmws.add(new BMW()); //加入两辆宝马进入这个集合ArrayList<BENZ> benzs = new ArrayList<>(); //创建奔驰车集合benzs.add(new BENZ());benzs.add(new BENZ()); //同样加入两辆奔驰进入这个集合//此时调用比赛方法go(bmws);go(benzs); //会发现报错,无法调用,数据类型不一样}public static void go(ArrayList<Car> cars){}
}

此时的ArrayList<BMW>和ArrayList<BENZ>其实和ArrayList<Car>已经没有关系了,或者说不算作是同一个数据类型了,所以无法调用传参为ArrayList<Car>的go方法。

所以就需要用到泛型方法了

对go方法进行修改:

public static <T> void go(ArrayList<T> cars){}

但这个还是存在问题的,比如这个方法不仅宝马、奔驰对象可以加入,其他一些对象,比如狗(Dog)对象也可以加入;这就不符合我们的需求了。所以再稍加修改:

public static <T extends Car> void go(ArrayList<T> cars){}

这就是我们限定了T能接受的类型,它只能是Car类或者是Car的子类;Dog类和其他不是Car的子类的就会被踢出去了 。

这样其实就可以满足这个需求了。

接着我们就可以引入我们的通配符知识点了

我们看这里ArrayList<T>它自己就是一个泛型类,而前面又再定义了一个泛型方法,这是没有没有必要的,Java中提供了一种方案,让我们可以解决这个问题,也就是通配符

  通配符,在使用泛型的时候可以代表一切类型

public static void go(ArrayList<? extends Car> cars){}

我们在定义泛型的时候一般用E、T、K、V......但是我们使用泛型的时候,就可以用“?”来表示一切类型,这里“? extends Car”的意思就是:可以传入一切是Car或者Car子类的类型。

这种写法称为上限技术,顾名思义Car类就是它最高可以传入的类型了;与其相反的就是下限技术:(用得稍微少一点)

public static void go(ArrayList<? super Car> cars){}

也就是最低也要传入Car类,往上就是Car的父类。


小结 

通配符

  • 就是“?”,可以在“使用泛型”的时候代表一切类型;E T K V是在定义泛型的时候使用。

泛型的上下限

  • 泛型上限:? extends Car :?能接收的必须是Car或者其子类。
  • 泛型下限:? super Car:?能接收的必须是Car或者其父类。

泛型擦除和注意事项

  • 泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型了,这就是泛型擦除
  • 泛型不支持基本数据类型,只能支持对象类型(引用数据类型)。

关于泛型擦除,我们要使用Java的反编译工具XJad来查看,

我们自己编写的代码在编译成class文件之后,泛型的数据类型都恢复成Object的了,底层会自己强转类型。也就是擦除了泛型。

第二点,泛型不支持基本数据类型,比如int、double,都是不支持的。

如果你非要使用基本数据类型,可以使用int类型的对象类型 Integer ,以及double类型的对象类型Double,例如:

public class Test{public static void main(String[] args){    //ArrayList<int> list1 = new ArrayList<>();//ArrayList<double> list1 = new ArrayList<>(); //都会报错//使用他们的对象类型就不会报错了ArrayList<Integer> list1 = new ArrayList<>();ArrayList<Double> list1 = new ArrayList<>();}
}

关于这些对象类型,接下来的文章会再详细了解。

至此,面向对象最核心的语法知识就全部学完了,接下来Java的学习,就是拿着这些语法知识去学习一个一个的API,API掌握得越多,Java的编程能力相对来说也就更强了,关于API的学习,前面我们学习过一些,接下来将更深入、更多地去学习。


END


学习自:黑马程序员——JavaSE课程

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RTOS中临界区嵌套保护的实现原理(基于RT-Thread)

0 前言 什么是临界区&#xff08;临界段&#xff09;&#xff1f; 裸机编程中由于不涉及线程和线程切换&#xff0c;因此没有临界区这一个概念。在RTOS中由于存在线程切换等场景&#xff0c;便有了临界区这个概念。简单来说&#xff0c;临界区就是不允许被中断的代码区域。什么…

代码随想录算法训练营第39天|62.不同路径 |63. 不同路径 II

代码随想录算法训练营第39天|62.不同路径 |63. 不同路径 II 详细布置 62.不同路径 本题大家掌握动态规划的方法就可以。 数论方法 有点非主流&#xff0c;很难想到。 https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html 视频讲解&#xff1a;https…

网络钓鱼升级 Darcula如何窃取用户信息

近日&#xff0c;网络安全领域一种名为 “Darcula” 的网络钓鱼欺诈&#xff08;PhaaS&#xff09;悄然兴起。这种新型钓鱼方式不同于传统的手段&#xff0c;它巧妙地利用了谷歌信息和 iMessage 的富通信服务&#xff08;RCS&#xff09;&#xff0c;成为了网络犯罪分子的新手段…

dockerfile制作-pytoch+深度学习环境版

你好你好&#xff01; 以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 文档内容docker相关术语docker常用命令容器常用命令根据dockerfile创建容器dokerfile文件内容 docker问题&#xff1a;可能的原因和解决方法示例修改修改后的D…

vscode调试Unity

文章目录 vscode调试UnityC#环境需求开始调试 Lua添加Debugger环境配置联系.txt文件配置Java环境 添加调试代码断点不生效的问题 vscode调试Unity C# 现在使用vscode调试Unity的C#代码很简单&#xff0c;直接在vscode的EXTENSIONS里面搜索“Unity”&#xff0c;第一个就是&am…

YOLOv8改进 | 细节涨点篇 | 利用YOLOv8自带的RayTune进行超参数调优

一、本文介绍 本文给大家带来的改进机制是利用Ray Tune进行超参数调优,在YOLOv8的项目中目前已经自带了该超参数调优的代码,我们无需进行任何的改动,只需要调用该方法输入我们的一些指令即可,当然了,这些超参数的设置还是比较又学问的,本文的内容也是应群友的需求进行发…

研发设计人员能力级别定义

研发设计人员能力&级别定义 1. 源由2. 级别定义3. 级别能力3.1 助理工程师3.1.1 工作内容3.1.2 级别晋升3.1.3 详细描述 3.2 初级工程师3.2.1 工作内容3.2.2 级别晋升3.2.3 详细描述 3.3 高级工程师3.3.1 工作内容3.3.2 级别晋升3.3.3 详细描述 3.4 资深工程师3.4.1 工作内…

【Entity Framework】EF中的增删改查

【Entity Framework】EF中的增删改查 文章目录 【Entity Framework】EF中的增删改查一、概述二、DbContext数据上下文三、EntityState五个状态值四、EF添加数据4.1 EF Add方式4.2 EF 通过改变对象的状态为 Added4.3 调用方sql4.4 调用存储过程 五、EF修改数据5.1 不查询数据库&…

仿真黑科技EasyGo DeskSim 2022

DeskSim2022的FPGA支持多种solver的混合应用&#xff0c;对于每一种solver可以采用不同的仿真步长&#xff0c;以下图模型为例&#xff0c;模型运行在FPGA上&#xff0c;FPGA解算方式采用的是Power Electronic & FPGA Coder解算&#xff0c;其中电力电子电路部分采用了两种…

ssm013小型企业办公自动化系统的设计和开发+vue

小型企业办公自动化系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对小型企业办公信息管理混乱&am…

wps 开发插件

官方文档参考wps官方文档参考 1.环境安装 安装wps https://www.wps.cn/ 安装Node.js https://nodejs.org/en 安装代码编辑器 Visual Studio Code https://code.visualstudio.com/ 环境检查-进入cmd查看 node -v2.demo 2.1 demo下载 打开vscode&#xff0c;新建终端 安装…

C#学习笔记 面试提要

冒泡 for (int m 0; m < arr.Length; m) { for (int n 0; n < arr.Length - 1 - m; n) { if (arr[n] > arr[n1]) { int temp arr[n]; arr[n] arr[n 1]; arr[n1] temp; } } } 选择 for (int m 0; m < arr.Length; m) { int index 0; for (int n 1; n < …

HackTheBox-Mist

整体思路 端口扫描->Pluck CMS组件文件读取漏洞->文件上传获取shell->创建指向exe的快捷方式来提权-> 信息收集&端口利用 namp -sSVC 10.10.11.17目标只开放了80端口&#xff0c;将mist.htb加入到hosts文件后&#xff0c;访问mist.htb Pluck CMS文件读取 在…

中科驭数超低时延网络解决方案入选2023年度金融信创优秀解决方案

近日&#xff0c;由中国人民银行领导、中国金融电子化集团有限公司牵头组建的金融信创生态实验室发布「2023年度第三期金融信创优秀解决方案」&#xff0c;中科驭数超低时延网络解决方案从众多方案中脱颖而出&#xff0c;成功入选&#xff0c;代表了该方案的技术创新和金融实践…

HUAWEI 华为交换机 配置 Eth-Trunk 接口流量本地优先转发示例(堆叠)

组网需求 说明 S5720I-10X-PWH-SI-AC 和 S5720I-6X-PWH-SI-AC 不支持此配置。 如 图 3-23 所示&#xff0c;为了增加设备的容量采用设备堆叠技术&#xff0c;将 Switch3 和 Switch4通过专用的堆叠电缆链接起来&#xff0c;对外呈现为一台逻辑交换机。为了实现设备间的备份、…

算法题->盛最多水的容器C语言和JAVA双指针解法

盛最多水的容器C语言和JAVA双指针解法 题目描述: 力扣链接:https://leetcode.cn/problems/container-with-most-water/description/ 题意: 根据数组中的值(高)和下标差值(宽),求能容纳最多的体积V. 例子: 输出49的求解过程,根据木桶效应,存储水的高度由短木板决定,故 V 短…

瑞_23种设计模式_迭代器模式

文章目录 1 迭代器模式&#xff08;Iterator Pattern&#xff09;★★★1.1 介绍1.2 概述1.3 迭代器模式的结构1.4 中介者模式的优缺点1.5 中介者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析 &#x1f64a; 前言&#xff1a;本文…

NBU备份oracle详细配置文档(含常见报错处理方法)

​前提 NBU master和media服务器已经配置OK&#xff0c;现在需要oracle主机安装agent并配置备份任务。 NBU master版本8.3.0.2 Oracle OS版本redhat 6.8 Oracle版本 11.2.0.4 1.Oracle 安装agent 下载安装档 https://www.veritas.com/content/support/zh_CN 选择…

产品经理的进阶之路

点击下载《产品经理的进阶之路》 1. 前言 本文深入剖析了产品经理这一职业从产品专员起步,逐步晋升为产品经理、高级产品经理,直至产品总监的整个职业发展路径。在每个阶段,产品经理都需承担不同的工作职责,展现出独特的职业特点。 2. 产品专员 关键词【产品需求/原型/文…

【操作系统】FCFS、SJF、HRRN、RR、EDF、LLF调度算法及python实现代码

文章目录 一、先来先服务调度算法&#xff08;FCFS&#xff09; 二、短作业优先调度算法&#xff08;SJF&#xff09; 三、高响应比优先调度算法&#xff08;HRRN&#xff09; 四、轮转调度算法&#xff08;RR&#xff09; 五、最早截至时间优先算法&#xff08;EDF&#…