【Java功能体】快速入门“泛型”

如何快速深入学习 Java 的泛型? 哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 阅读详情

就像是在真实的世界中,用于装每种东西的容器都是不一样的,如装水的叫做水杯、水桶,装煤气的叫做罐子。在集合中,用于装每种数据类型的集合也是不一样的,如String类型必须放在String标记过的集合中而不能放在Integer标记的集合中。在集合中学习泛型,易于理解和接收,本文文将以集合为基础讲解Java语言中泛型机制的用法!

泛型的定义: 为一个集合容器添上一种标记,即指定该集合容器有且只能放哪种类型的数据。

泛型的本质:

  • 是一个数据类型的占位符或者是一个数据类型的变量(类比于C++中的模板)。
  • 一个方法可以接收任意类型的参数,而且返回值类型必须要与实参的类型一致。则是泛型。

泛型的特性:
1,泛型没有多态的概念,左右两边的数据类型必须要一致,或者只是写一边的泛型类型。推荐两边都写泛型。
2,始于JDK1.5;
3,将运行时的异常提前至了编译时。
4,避免了无谓的强制类型转换。
5,在泛型中不能使用基本数据类型,如果需要使用基本数据类型,那么就使用基本数据类型对应的包装类型。

出于规范的目的,Java 还是建议我们用单个大写字母来代表类型参数。常见的如:

  1. T 代表一般的任何类。
  2. E 代表 Element 的意思,或者 Exception 异常的意思。
  3. K 代表 Key 的意思。
  4. V 代表 Value 的意思,通常与 K 一起配合使用。
  5. S 代表 Subtype 的意思

以集合为例,展示泛型的使用方法:

ArrayList<String>  list = new ArrayList<String>();  true     推荐使用。
ArrayList<Object>  list = new ArrayList<String>();  false
ArrayList<String>  list = new ArrayList<Object>();  false

//以下两种写法主要是为了兼顾新老系统的兼用性问题。
ArrayList<String> list = new ArrayList();   true
ArrayList list = new ArrayList<String>();  true   

泛型类

泛型类的定义格式:

class 类名<声明自定义泛型>{
	。。。
}

泛型类要注意的事项:

  1. 在类上自定义泛型的具体数据类型是在使用该类的时候创建对象时候确定的。
  2. 如果一个类在类上已经声明了自定义泛型,如果使用该类创建对象 的时候没有指定 泛型的具体数据类型,那么默认为Object类型。
  3. 在类上自定义类的泛型不能作用于静态的方法,如果静态的方法需要使用自定义泛型,那么需要在方法上自己声明使用。(原因:静态的泛型不能引用非静态的泛型)

快速理解泛型类:

class MyArrays<T>{ //定义了泛型:T
	//元素翻转
	public void reverse(T[] arr){ //使用泛型
		for(int startIndex = 0, endIndex = arr.length-1 ; startIndex<endIndex ; startIndex++,endIndex--){
			T temp  = arr[startIndex];
			arr[startIndex] = arr[endIndex];
			arr[endIndex] = temp;
		}
		
	}
	
	public String toString(T[] arr){
		StringBuilder sb = new StringBuilder();
		for(int i = 0 ; i < arr.length ; i++){
			if(i==0){
				sb.append("["+arr[i]+",");
			}else if(i==arr.length-1){
				sb.append(arr[i]+"]");
			}else{
				sb.append(arr[i]+",");
			}
		}
		return sb.toString();
	}
	
	public static <T>void print(T[] t){ //静态的泛型不能引用类泛型,即非静态的泛型
		
	}
}

public class Demo3 {
	public static void main(String[] args) {
		Integer[] arr = {10,12,14,19};
		MyArrays<Integer> tool = new MyArrays<Integer>(); //泛型被确定为Int型;
		tool.reverse(arr);
		System.out.println("数组的元素:"+tool.toString(arr));
		
		MyArrays<String> tool2 = new MyArrays<String>();
		String[] arr2 = {"aaa","bbb","ccc"};
		tool2.reverse(arr2);
				
ArrayList list = new ArrayList ();  //没有指定泛型类型,那它默认为Object类型;
		ArrayList<String> list = new ArrayList<String>();
	}
}

泛型接口

定义格式:

interface 接口名<声明自定义泛型>{
	...
	}

泛型接口要注意的事项:

  1. 接口上自定义的泛型的具体数据类型是在实现一个接口的时候指定的。
  2. 在接口上自定义的泛型如果在实现接口的时候没有指定具体的数据类型,那么默认为Object类型。

实现一个还不明确、我目前要操作的数据类型接口的时候,要等待创建接口实现类 对象的时候我才能指定泛型的具体数据类型。

interface Dao<T>{ //接口
	public void add(T t);	
}

class Deo<T> implements Dao<T> {
	public void add(T t){
		//空实现也算实现
	}
}

public class Test {
	public static void main(String[] args) {
		Deo<String> d = new Deo<String>(); //指定该泛型为String类型,上面代码中的T都表示是String类型了
	}
}

泛型方法

方法泛型注意的事项:

  1. 在方法上自定义泛型,这个自定义泛型的具体数据类型是在调用该方法的时候传入实参时确定具体的数据类型的。
  2. 自定义泛型只要符合标识符的命名规则即可, 但是自定义泛型我们一般都习惯使用一个大写字母表示。 T Type E Element

快速理解泛型方法:

public class Demo{

	public static void main(String[] args) {
		String str = getData("abc");  //在调用时依据传入实参才确定泛型的数据类型;
		Integer i = getData(123);  //使用基本数据类型时是使用的其包装类;
	}
	
	public static <T>T getData(T o){  //自定义泛型法则;
		return o;
	}
}

泛型的上下限

诞生背景:
现有以下两个需求,如何才能实现?

  • 需求1: 定义一个函数可以接收任意类型的集合对象,要求接收的集合对象只能存储Integer或者是Integer的父类类型数据。
  • 需求2: 定义一个函数可以接收任意类型的集合对象,要求接收的集合对象只能存储Number或者是Number的子类类型数据。

**泛型中通配符: ? **

  • ? super Integer : 只能存储Integer或者是Integer父类元素。泛型的下限:[Integer, ?]
  • ? extends Number:只能存储Number或者是Number类型的子类数据。泛型上限:[?, Number]

快速理解泛型的上下线:

public static void main(String[] args) {
		ArrayList<Integer> list1 = new ArrayList<Integer>();
		ArrayList<Number> list2 = new ArrayList<Number>();
		
		HashSet<String> set = new HashSet<String>();
		//getData(set);
	}
	//泛型的上限
	public static void getData(Collection<? extends Number> c){ //Number及其子类	

	}

	//泛型的下限
	public static void print(Collection<? super Integer> c){ //Integer及其父类

	}

java 泛型类的类型识别示例 java 泛型类的类型识别示例 java 泛型类的类型识别示例 java 泛型类的类型识别示例 立即下载

相关推荐

告别环境报错:用Pycharm一站式搞定Superset 3.0.0二次开发环境(Windows/Mac通用)

本文详细介绍了如何使用Pycharm一站式搭建Apache Superset 3.0.0的二次开发环境,涵盖Windows和Mac平台。通过虚拟环境配置、依赖管理、数据库初始化及前后端协同开发等步骤,帮助开发者高效解决环境报错问题,提升开发效率。特别适合需要进行Superset二次开发的工程师参考。

weixin_42549496的博客 316

Java获取泛型参数的类型的方法

最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下。 由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)。 但是有的时候,我们确实需要获知泛型参数的类型,比如将

canchew的专栏 2万+

【数据分享】1985-2023年30米CLCD土地覆盖栅格数据分享

总的来说,CLCD 反映了中国快速的城市化进程和一系列生态工程,揭示了气候变化条件下人为对 LC的影响,其在全球变化研究中具有潜在应用价值。最后,通过目视解译的独立样本和第三方测试样本评估CLCD的准确性。特别地,该研究将CLCD产品与目前最先进的30m专题产品包括不透水表面积(ISA)、地表水和森林进行比对,以综合评估CLCD的质量(以下为技术流程图)。数据分类:分为九类用地,该数据包括9种用地类型,分别为:农田、森林、灌木、草原、水域、冰雪、裸地、不透水面、湿地。数据格式:.tif格式。

weixin_61129400的博客 6920

java泛型

文章目录一、泛型的概念二、泛型的定义典型场景泛型类有界类型 一、泛型的概念 泛型是jdk5引入的类型机制,就是将类型参数化,它是早在1999年就制定的JSR14的实现。泛型作为一种安全机制而产生 public void pp(String str){} //str实际上是形参 public void pp(Integer str){} 调用时按照位置对应传入实际数据,实际数据叫做实参 pp("dddd") 泛型机制将类型转换时的类型检查从运行时提前到了编译时,使用泛型编写的代码比杂乱的使用object并

persistence_PSH的博客 309

基于价值的深度强化学习:DQN

本文主要是介绍DQN原理和算法伪代码和代码实现,算法实现包括pytorch版本和stable-baselines3版本

溯源的专栏 1083

Pixel 6 Pro刷Android 13变砖自救指南:fastboot全分区擦除与手动刷入教程

本文提供了一份详细的Pixel 6 Pro在Android 13升级过程中变砖后的自救指南。针对因super分区锁死或动态分区异常导致的无法启动问题,文章核心介绍了通过fastboot命令手动擦除关键分区并逐一刷入官方镜像的完整救砖流程,帮助用户实现系统重建与恢复。

weixin_29208327的博客 371

JAVA的泛型

泛型类

m0_62645012的博客 2196

1006. 换个格式输出整数 (15)-PAT乙级真题

1006. 换个格式输出整数 (15)让我们用字母B来表示“百”、字母S表示“十”,用“12…n”来表示个位数字n(&lt;10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。输入格式:每个测试输入包含1个测试用例,给出正整数n(&lt;1000)。输出格式:每个测试用例的输出占一行,用规定的格式输出n。输入样例1...

柳婼 の blog 2242

理解JAVA泛型,看这一篇

文章目录前言一、为什么使用泛型?二、泛型标记三、泛型使用3.1泛型方法3.2泛型类3.3泛型接口四、对泛型上限的限定五、对泛型下限的限定六、类型擦除总结 前言 在JAVASE的集合章节已经简单介绍了泛型的概念以及基本使用,本章将继续讲解有关泛型的内容,包括泛型上下限的限定以及类型擦除等内容。 一、为什么使用泛型? 在不使用泛型的情况下我们可以通过引用Object类型来实现参数的任意化,因为Object是所有类的父类。 但是我们仔细想想这样做的话有什么后果? 具体使用时需要进行强制类型转换(父类转成子类)

qq_52173163的博客 1162

架构师之HBase vs MongoDB 技术选型与场景决策实战案例

面对海量数据和高并发查询,该选 HBase 还是 MongoDB?本文为你提供完整的决策框架!从数据模型对比、架构解析、六大真实场景(电信 CDR、金融行情、广告点击流、电商商品、社交档案、内容管理)到性能、一致性、运维全面对比,助你在 PB 级时序数据和灵活查询之间做出精准选择!

肖哥弹架构博客 1097

C#与欧姆龙PLC 通信——Fins Tcp协议

该调试助手专门为了帮助大家学习以及测试Fins-Tcp通信,下面进行详细介绍。

qq_34059233的博客 2081

JAVA泛型容器的类型检查

泛型容器是通过指定容器包含对象的类型,由编译器保证对象类型的正确性,在编译阶段就能检查出类型错误。如下列将List对象longList赋予一个List对象gtList,会报编译错误。如果这只是在编译检查,那么我们是否可以绕过编译检查呢?

jeff_fangji的专栏 6726

揭秘大厂 Unity 红点系统设计:别小看右上角那颗小红点,它能把你项目搞崩

本文详细探讨了游戏大厂如何设计高性能红点系统。红点作为提升用户活跃和转化率的重要工具,需要支持多级联动、动态判断和全局一致性。系统采用观察者模式和树形结构,分为数据管理、逻辑判定、订阅通知和UI展示四大模块,通过事件驱动方式实现高效刷新。文章特别强调了解耦设计、配置化管理和性能优化,并提出了热更新、数据分析等高级应用场景。最终指出,优秀的红点系统需要架构标准化、自动化配置和团队紧密协作,是大型游戏项目的关键技术基础。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 377

【编程语言】Kotlin快速入门 - 泛型

Java工程师Kotlin快速入门之泛型

XuanRan的博客 5023

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

通过案例快速理解JAVA泛型

一、上栗子 ​ 啥都不说先上例子:定义一个Show方法,实现一个“弱智”的功能,输出传入的参数值。 先来考虑传入的是一个int类型参数,秒写下面代码: public static void Show(int param){//为了能在main方法中调用,定义为static,知识点:静态方法调用 System.out.println(param); } //main方法如下 public static void main(String[] args) { Show(123); //调用static方法,输

cqzhongj的博客 1148

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java 中的泛型详解

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参列表,普通方法的形参列表中,每个形参的数据类型是确定的,而变量是一个参数。在调用普通方法时需要传入对应形参数据类型的变量(实参),若传入的实参与形参定义的数据类型不匹配,则会报错。那参数化类型是什么?以方法的定义为例,在方法定义时,将方法签名中的形参的数据类型也设置为参数(也可称之为类型参数),在调用该方法时再从外部传入一个具体的数据类型和变量。

XuChaofafa的博客 1704

java中的泛型

本文详细的介绍了java中的泛型,包括泛型的定义,泛型的使用以及注意事项

weixin_74200123的博客 1001

Java泛型

对Java泛型学习的一点心得

weixin_57473640的博客 1096

JAVA快速入门-泛型

转载自 http://blog.youkuaiyun.com/itdo_just https://blog.youkuaiyun.com/itdo_just/article/details/79328549 泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代...

拼搏的小白 328

Java泛型总结一 为什么使用泛型

快速了解泛型 1泛型可以使用在类或者方法上。 2泛型是一种约束,把握住了入口(通过强制类型检查来实现)和出口(通过自动类型转换来实现)。 3泛型是一种占位符或者说模板,在编码时把一个变量由具体化变成了抽象化,增加了代码的灵活度。 4泛型只在编译时起作用,编译之后可以理解为就是一个Object类型,在运行时可以通过反射操作绕过泛型的限制,传入不同的类型。 5泛型定义虽然可以约束声明时传入的参数类型...

编程人生 1937

Java 泛型详解

全网最详细最权威的Java泛型知识讲解。带大家深入浅出的了解泛型相关知识以及结合本人公司大佬的问题带大家深入泛型

CodeSuc 的技术博客 843

scala快速入门系列【泛型】

        本篇作为scala快速入门系列的第三十五篇博客,为大家带来的是关于泛型的内容。 文章目录泛型定义一个泛型方法泛型类上下界上界下界协变、逆变、非变非变协变逆变 泛型         scala和Java一样,类和特质、方法都...

大数据梦想家 2486

121. Java 泛型 - 泛型类型

本文介绍了Java泛型的基本概念,通过Box类示例展示了从非泛型到泛型版本的转换过程。非泛型Box类使用Object类型存储数据,存在类型转换风险;泛型版本通过类型参数T解决了这一问题,确保类型安全。文章还讲解了类型参数的命名约定、实例化方式(包括Java 7引入的菱形语法),以及如何定义和使用多个类型参数。最后展示了参数化类型的应用,说明泛型可以灵活组合复杂类型,提高代码的可重用性和安全性。

yaoxin521123的博客 1075

Java泛型编程快速入门

Java泛型编程快速入门 JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0。这说明Java已经有大幅度的变化。本文将讲解JDK5.0支持的新功能-----Java的泛型. 1、Java泛型 其实Java的泛型就是创建一个用类型作为参数的类。就象我们写类的方法一样,方法是这样的method(String str1,String str2 ...

diaoyinji6441的博客 122

泛型快速入门

泛型 概述 泛型在Java中有着很重要的地位,在面向对象编程及各种设计模式中都有非常广泛的应用。 概念 广泛的类型。 为什么要使用泛型? 1、将错误从运行时期提前到了编译时期。 (在jdk1.5之前,集合中可以装各种各样的对象,这样取出来对象只能用Object对象接受,但是当要明确其类型时,必须强制转换,而且强制转换的错误只能在 运行期才能发现。然而jdk1.5新特性泛型彻底解决了这样的问题。 泛型规定一个类只能装什么,取出时也无需强制转换,因为限定了装什么,也就知道取出是什么了。 若装其它东西会在编译时期

qq_44644976的博客 187

Java之泛型

可以把泛型理解为可以表示数据类型的一种数据类型4的解释//如果你不写的话,默认为ObjectobjectPerson.s=newString("c");//现在Person里面的s只能是String了Person.s="小袁";//传入其他类型的会报错}}classPerson<T>{//代表我们的name是String类型Ts;//s则是T类型,这个T类型是你在创建的时候定义的类型}就是相当于把你里面传入的类型(实参).........

y_k_j_c的博客 797
上一篇: 【Java集合】逻辑结构超强、表达十分清晰的“Collection接口”及“List接口、Set接口”解析
下一篇: 【jQuery】初识JavaScript函数库:jQuery
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值