Java泛型方法解惑

article/2025/9/21 6:08:12

概述

什么是泛型?

泛型,是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?
顾名思义,就是将类型由原来的具体的类型参数化,然后在使用/公用时传入具体的类型这种参数类型可以用在类、方法和接口中,分别被称为泛型、泛型方法、泛型接口。

为什么要使用泛型?

一言以蔽之,编译时检测到非法的类型
场景:给你一个ArrayList,让你求该list中所有元素的和。(注意,该list原则上是要存int类型的数的)
没有泛型之前:

  ArrayList arrayList = new ArrayList();arrayList.add(1);arrayList.add(2);arrayList.add(3);//非法输入,但不会报错arrayList.add("3");

求list的元素和的话我会遍历该list,然后依次相加。
发现这个list最后存入了一个String类型的值,当你遍历相加肯定是得不到正确答案的!
使用泛型之后:

ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
//非法输入,直接报错
arrayList.add("3");

可以看出在创建list时指定了存储的类Integer,因此在后续添加元素时添加了String就直接报错了,因此求和操作就不会受到影响。

泛型种类

泛型类

基本语法:
在这里插入图片描述
示例:

public class Generic<T> {//成员属性T value;public Generic(T value) {this.value = value;}//注意这不是泛型方法T getValue() {return this.value;}
}

注意点:

  1. 使用时才指定类型,不能是基本数据类型(泛型底层是通过Object实现的,基本类型不继承Object)
  2. 若不指定类型,则默认为Object
  3. 指定不同类型后他们实际上依然是该泛型类(即泛型只在编译期间有效,就是是所谓的泛型擦除

扩展:
对泛型类进行继承时应该注意以下两点:
在这里插入图片描述

泛型接口

泛型接口跟泛型类的使用基本上是一样的,在此不再赘述,但实现接口时依然要牢记以下两点:
在这里插入图片描述

泛型方法

泛型类和泛型接口都很容易理解,所以本文的重点是泛型方法,相信大家在学习泛型方法过程中会有几个疑问:

  1. 为啥使用到泛型成员的方法不是泛型方法
  2. 泛型方法有啥用

先抛出问题,相信看完接下来的案例之后就会恍然大悟。
语法:
在这里插入图片描述
可以发现泛型方法的申明要在返回值前加<>,也就是说只有加了这个尖括号的方法才是泛型方法,而上面的泛型类中的示例就不是泛型方法。
解惑:
先来看为什么要有泛型方法:
假如我们定义一个方法,用于返回给定任意类型的参数的String(虽然这是没有意义的),
既然要具有通用性,那么我们会想到用泛型来解决,因此定义了以下的方法:
在这里插入图片描述
其实我们定义了一个泛型类,然后里面的方法使用到了泛型,但是事与愿违,这个方法并不能返回任何类型参数的String,因为这个方法不是泛型方法,在创建泛型类时就把它指定成了Integer类型,当我们传入Long类型的参数时编译器就会报错。
接下来我们使用真正的泛型方法:
在这里插入图片描述
可以发现不再报错了,但是前面也说了这个方法实际上是没有意义的,因此下面我们定义一个有意义的方法:

给定类的字节码对象,然后返回一个该类的实列

我们会考虑:

  1. 给定类字节码创建对象肯定就调用字节码对象的newInstance方法
  2. 既然要通用,那么返回值是不确定的,那直接用Object没问题吧

于是就得出了以下代码:(请忽略类上的< T >)
在这里插入图片描述
可以发现能够正常运行,但是细心的你一定会发现调用方法后必须要强转类型!

所以就要使用泛型方法了:(请忽略类上的< T >)
在这里插入图片描述
至此关于泛型方法的一些疑惑相信都已经消失了吧!

注意点:

  1. 泛型方法中的泛型和泛型类的泛型是独立
  2. 如果static方法要使用泛型能力,就必须使其成为泛型方法(因为泛型类需要指定类型才能确定)

http://chatgpt.dhexx.cn/article/I99KTvCg.shtml

相关文章

推荐一款超级好用的AI模型训练平台——Tesra超算网络!

2019独角兽企业重金招聘Python工程师标准>>> 作为一个刚接触AI行业的小萌新&#xff0c;好不容易做好了一个深度学习的模型&#xff0c;然后就兴冲冲的想要在我的电脑上做训练&#xff0c;自我感觉我的笔记本的性能还不错&#xff0c;然后loss下降很慢&#xff0c;再…

AI行业全面复苏,秋招AI岗位竞争激烈!Tesra超算网络助力找到合适的岗位!

2019独角兽企业重金招聘Python工程师标准>>> 随着各大互联网巨头纷纷下场&#xff0c;AI技术再经历过几次寒冬之后全面复苏&#xff0c;站在了时代的风口&#xff0c;迎来了爆发时期&#xff0c;成为了时代的趋势&#xff01;人工智能企业搞得轰轰烈烈势如破竹&…

大数据与AI时代,企业爆发之道?Tesra超算网络保驾护航!

2019独角兽企业重金招聘Python工程师标准>>> 现如今&#xff0c;人人都在谈论大数据&#xff0c;大数据究竟能够为企业带来什么呢&#xff1f;大数据又怎么才能够为企业带来最大的效益呢&#xff1f; 随着大数据时代的到来&#xff0c;根据数据分析的需求也由此诞生…

人工智能的春天来了!Tesra超算网络,助力AI开发!

2019独角兽企业重金招聘Python工程师标准>>> 我们必须承认&#xff0c;尽管人工智能技术的起源可以追溯到数十年前&#xff0c;不过受限于软硬件的发展&#xff0c;人工智能直到近几年才开始突飞猛进。其中算力是制约人工智能发展的首要因素&#xff0c;随着算力瓶颈…

ApacheCN×Tesra 免费算力申请活动

Tesra 超算网络是由 SAIC 基金会发起的&#xff0c;专为人工智能产业提供底层技术及 AI 资源共享服务的分布式"超算中心"。Tesra 超算网络基于 GPU 并行计算技术&#xff0c;通过整合全球分散的 GPU 算力资源&#xff0c;在建设人工智能基础设施的同时&#xff0c;为…

Tesra超算网络AI训练的使用流程

这篇文章将会为大家详细地介绍一下&#xff0c;Tesra超算网络AI训练的使用流程。 ​在使用Tesra超算网络进行AI模型训练前&#xff0c;需要完成官网注册和开发者钱包注册。 ​一&#xff1a;官网注册 ​Tesra超算网络的官网地址&#xff1a; http://supernet.tesra.io &…

Tesra平台训练数据(没有足够强大的显卡情况下使用云端跑代码)(一)

本地训练或者跑一些代码&#xff0c;比如用深度学习处理行人识别的视频&#xff0c;比较慢&#xff0c;又没有足够的钱换硬件啥的&#xff08;比如说博主&#xff0c;穷的一塌糊涂&#xff0c;没有钱配好的电脑&#xff09;&#xff0c;这时候考虑用一些算力平台来跑代码。 博主…

TESRA旗下InFlex计算平台使用流程

​这篇文章将会为大家详细地介绍一下&#xff0c;TESRA旗下InFlex计算平台的使用流程。 ​在使用InFlex计算平台训练前&#xff0c;需要完成**注册**。 ​一、注册 InFlex计算平台的官网地址&#xff1a; 注册登录 网址&#xff1a;https://www.tesra.cloud/ 使用手机号码注…

tesra内测阶段在线GPU的使用

官网是&#xff1a; https://www.tesra.org 注册个账号即可 &#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;&#xff03;算力券兑换&#xff03;&#xf…

2020年2月12日学习记录

今天学习了&#xff1a; 1.c#入门经典—成员定义和其他成员主题 2.计算机三级数据库技术—其他查询操作 3.计算机网络自顶向下第四章网络层第一遍—路由选择算法、路由选择层次 4.计算机组成课程第七章—操作码 地址码内容 5. 啊哈算法 快速排序实现 6.CSAPP英文版十页 —十…

10进制数转换为16位二进制数

写在前面&#xff1a; 题解是对具体题目的编程实现&#xff0c;不会具体讲解C语言语法。请先大致学习好语法&#xff0c;自己敲敲代码后再看题解&#xff08;上来就直接看题解的习惯不好哟~&#xff09;。在每一题的题解之前&#xff0c;会列出本题涉及到的语法知识供参考&…

vue 实现12个月的平铺式日历插件

实现的基本样式如下&#xff1a; 使用方法 1、安装插件 npm install vue-material-year-calendar --save2、导入插件 import YearCalendar from vue-material-year-calendar3、代码实现 <template><YearCalendarv-model"year":activeDates.sync"…

【LeetCode刷题】二月汇总篇

学习总结 文章目录 学习总结一、时间安排task01 数组task02 链表task03 栈task04 字符串task05 树task06 位运算task07 双指针task08 搜索task09 排序task10 动态规划task11 分治task12 哈希表 一、时间安排 阿里云天池leetcode训练营&#xff08;二月&#xff09;。 task01 数…

2019年9月全国计算机二级准考证打印,2019年9月计算机二级准考证打印入口公布...

2019年下半年全国计算机考试已经进入紧张备考中&#xff0c;在9月21日正式开考&#xff0c;请考生提前打印准考证&#xff0c;目前各市的准考证打印网址开通&#xff0c;考生可以自行打印。如果是在报名点报名的考生&#xff0c;可在报名点领取&#xff0c;下面我们来看各省打印…

MODIS16天数据月合成/季合成

1.MRT重投影、转换格式 重投影后命名为MOD13Q1.A2019129.250m_16_days_NDVI.tif 2.重命名 5月单独一期&#xff0c;即序号为129的一期。&#xff08;欢迎探讨&#xff09; 首先去掉前面的MOD13Q1. 再将001.250替换为0101 将129.250替换为0501 得到A20200501_16_days_NDVI.ti…

plc里的二进制 用计算机,如何理解二进制和十六进制(电工入门PLC知识普及)...

如何理解二进制和十六进制(电工入门PLC知识普及)三菱PLC直观易懂&#xff0c;便于入门&#xff01;&#xff01;而欧系的西门子PLC太复杂&#xff0c;不适合入门&#xff01;&#xff01;这句话已经成了很多人的口头语&#xff0c;但是&#xff0c;到底是为什么呢&#xff1f;&…

计算机二级报名时间2020年3月山西,2020年3月山西计算机二级报名及考试时间

摘要&#xff1a; 2020年3月山西计算机二级报名及考试时间为你介绍根据山西省2020年上半年全国计算机等级考试网上报名公告可知。山西2020年3月计算机二级报名及考试时间已经公布&#xff0c;以下是小编为大家整理的相关内容希望对大家有所帮助。 山西计算机二级报名及考试时间…

7月14日第壹简报,星期四,农历六月十六

7月14日第壹简报&#xff0c;星期四&#xff0c;农历六月十六1. 天链二号03星成功发射&#xff0c;中国第二代数据中继卫星系统正式建成。2. 微博、微信&#xff1a;将整治用谐音字、变体字等“错别字”发布、传播传播不良信息。3. 官方&#xff1a;严禁在就业上歧视曾经新冠核…

百度杯”CTF比赛(十二月场)

"百度杯"CTF比赛&#xff08;十二月场&#xff09; 第一场 1、传说中的签到题 解决&#xff1a;把二进制用在线进制转换器转换&#xff0c;发现转为10进制时&#xff0c;和tips2一样&#xff0c;在qq上一查&#xff0c;是CTF官方群&#xff0c;在公告里有一个字符串…

5月16日第壹简报,星期一,农历四月十六

5月16日第壹简报&#xff0c;星期一&#xff0c;农历四月十六1、重磅&#xff01;个人首套房商贷利率下限调整&#xff0c;可低至4.4%&#xff0c;30年贷款50万利息可省2万。2、IMF完成特别提款权&#xff08;SDR&#xff09;定值审查&#xff0c;人民币权重上调至12.28%。3、9…