Generic——可以接收数据类型的数据类型。本文将从总体上讲解Java泛型的优点、方法和相关细节。一、泛型的介绍众所周知,继承是面向对象的三大特性之一。比如我们往集合中添加元素时,add()方法填写的是Object类,Object就是所有的类。父类,这就产生了一个问题——添加的类型不能统一,所以可能会导致类型不统一的问题,在遍历集合取元素的时候报错。例如:我在一个ArrayList集合中添加了一个Person类的对象,却不小心添加了一个Boy类的对象,就会导致如下结果。传统方法在遍历时无法约束添加到集合ArrayList(不安全)的数据类型,需要进行类型转换。如果集合中的数据量很大,会影响效率,大大降低程序的健壮性。因此,设计者针对这个问题引入了泛型!更多合集系列教程:https://www.javastack.cn/cate...二、使用泛型的好处1、提高程序的健壮性和规范性针对以上问题,我们在使用泛型时,会出现很简单,只需要在编译类型后使用泛型指定具体的类型,编译器会自动检测不符合规范的类并抛出错误信息2.编译时,检查类型添加元素以提高安全性3.减少类型转换次数并提高效率。不使用泛型时:使用泛型时:4.类声明时可以用一个标识符来表示属性类型、方法返回值类型、参数类型classPerson{Es;//可以是属性类型publicPerson(Es){//可以是参数类型this.s=s;}publicEf(){//可以是返回类型returns;}publicvoidshow(){System.out.println(s.getClass());//显示S的运行类型}}可以这样理解:上面classPerson中的“E”相当于这里的E是一个body占位符,后面用到的时候程序员可以自定义,像这样publicstaticvoidmain(String[]args){Personperson1=newPerson("xxxx");//E->Stringperson.show();Personperson2=newPerson(123);//E->Integerperson.show();}运行结果:classjava.lang.Stringclassjava.lang.Integer三、泛型的常见用法1、定义泛型接口在写接口的时候,没有定义泛型。它默认为Object类。其实这样写是不规范的!如果一个接口的存在是一个规范,那么泛型接口就是规范中的规范interfaceIm{voidhi(Rr);voidhello(Rr1,Rr2,Uu1,Uu2);默认R方法(Uu){返回null;}}在上面的泛型接口中,已经规定必须传入U类和R类的对象,所以当我们传入其他类的对象时,就会报错,如图:Accordingtotherules,当我们实现一个接口的时候,我们必须实现它所有的方法,这时候我们可以在IDEA中重写接口中的方法时,将自己指定的类传入,编译器会自动替换掉与我们事先指定的类。二、定义一个泛型集合1、使用泛型方法将三个学生对象放入HashSet中,输出对象信息HashSetstudents=newHashSet();students.add(newStudent("懒羊羊",21));students.add(newStudent("喜羊羊",41));students.add(newStudent("喜羊羊",13));对于(学生学生:学生){System.out.println(学生);}上面泛型中的student是我预先定义的一个类,把它作为泛型放进去,用来约束传入的对象,减少遍历时的变换次数,提高效率2.用泛型的方法放三个student对象放入HashMap,并输出对象信息HashMaphm=newHashMap();//K->StringV->Student对应如下hm.put("001",newStudent("喜羊羊",21));hm.put("002",newStudent("懒羊羊",32));hm.put("003",newStudent("美羊羊",43));Set>ek=hm.entrySet();Iterator>iterator=ek.iterator();//取出迭代器while(iterator.hasNext()){Map.Entrynext=iterator.next();System.out.println(next.getKey()+&quo吨;-"+next.getValue());}HashMap是一个双列集合,以[K-V]的形式存储对象,所以在使用泛型传入两种类型时,我们都知道使用迭代器来遍历HashMap的时候使用时,首先要通过entrySet()获取键值对,然后通过转换得到对应的类,从而获取对象信息。而在使用泛型定义[K-V]时,指定了要提取的键值对的类型,省去了转换的步骤,也使程序变得简单高效。4.泛型使用细节1.<>类型规范2.继承体现在为泛型类型指定具体的类型,可以传入该类型或其子类类型Pap=newP(newA());Pap1=newP(newB());//AsubclassclassA{}classBextendsA{}3.简写Pap=newP(newA());定义泛型1.自定义方法使用类声明的泛型。当形参列表传入的数据类型与泛型不一致时,会报错,体现规范publicstaticvoidmain(String[]args){Uu=newU<>();u.hi("你好",1.0);//X->StringY->Double}classU{publicvoidhi(Xx,Yy){}//使用类声明的泛型类型}2.自定义泛型方法publicstaticvoidmain(String[]args){Uu=newU<>();u.m1("xx",22);//调用方法时,编译器会判断传入参数的类型,自动装箱}classU{publicvoidm1(Xx,Yy){}//Customgenericmethod}这里的自动装箱很有意思。自动在三种类型中匹配当前输入的数据类型,不需要考虑顺序,如图所示3.注意事项①泛型数组不能初始化,因为数组不能确定A的类型innew,所以不能在内存中开辟空间错误的写法:A[]a=newA[];②静态方法不能使用类定义的泛型类型的原因是静态成员与类有关。加载类时,尚未创建对象。因此,如果静态方法和静态属性使用泛型来源:iyu77.blog.csdn.net/article/details/125304857近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.惊艳!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!