首页 文章资讯内容详情

java 泛型详解

2026-06-01 3 花语

本文内容纲要:

普通泛型

Java代码

classPoint{//此处可以随便写标识符号,T是type的简称 privateTvar;//var的类型由T指定,即:由外部指定 publicTgetVar(){//返回值的类型由外部决定 returnvar; } public****voidsetVar(Tvar){//设置的类型也由外部决定 this.var=var; } }; public****classGenericsDemo06{ publicstaticvoidmain(Stringargs[]){ Pointp=newPoint();//里面的var类型为String类型 p.setVar("it");//设置字符串 System.out.println(p.getVar().length());//取得字符串的长度 } }; ---------------------------------------------------------- classNotepad<K,V>{//此处指定了两个泛型类型 privateKkey;//此变量的类型由外部决定 privateVvalue;//此变量的类型由外部决定 publicKgetKey(){ return****this.key; } publicVgetValue(){ return****this.value; } public****voidsetKey(Kkey){ this.key=key; } public****voidsetValue(Vvalue){ this.value=value; } }; public****classGenericsDemo09{ publicstaticvoidmain(Stringargs[]){ Notepad<String,Integer>t=null;//定义两个泛型类型的对象 t=newNotepad<String,Integer>();//里面的key为String,value为Integer t.setKey("汤姆");//设置第一个内容 t.setValue(20);//设置第二个内容 System.out.print("姓名;"+t.getKey());//取得信息 System.out.print(",年龄;"+t.getValue());//取得信息 } };

通配符

Java代码

classInfo{ privateTvar;//定义泛型变量 public****voidsetVar(Tvar){ this.var=var; } publicTgetVar(){ return****this.var; } publicStringtoString(){//直接打印 return****this.var.toString(); } }; public****classGenericsDemo14{ publicstaticvoidmain(Stringargs[]){ Infoi=newInfo();//使用String为泛型类型 i.setVar("it");//设置内容 fun(i); } publicstaticvoidfun(Info<?>temp){//可以接收任意的泛型对象 System.out.println("内容:"+temp); } };

受限泛型

Java代码

classInfo{ privateTvar;//定义泛型变量 public****voidsetVar(Tvar){ this.var=var; } publicTgetVar(){ return****this.var; } publicStringtoString(){//直接打印 return****this.var.toString(); } }; public****classGenericsDemo17{ publicstaticvoidmain(Stringargs[]){ Infoi1=newInfo();//声明Integer的泛型对象 Infoi2=newInfo();//声明Float的泛型对象 i1.setVar(30);//设置整数,自动装箱 i2.setVar(30.1f);//设置小数,自动装箱 fun(i1); fun(i2); } publicstaticvoidfun(Info<?extendsNumber>temp){//只能接收Number及其Number的子类 System.out.print(temp+"、"); } }; ---------------------------------------------------------- classInfo{ privateTvar;//定义泛型变量 public****voidsetVar(Tvar){ this.var=var; } publicTgetVar(){ return****this.var; } publicStringtoString(){//直接打印 return****this.var.toString(); } }; public****classGenericsDemo21{ publicstaticvoidmain(Stringargs[]){ Infoi1=newInfo();//声明String的泛型对象 Infoi2=newInfo();//声明Object的泛型对象 i1.setVar("hello"); i2.setVar(newObject()); fun(i1); fun(i2); } publicstaticvoidfun(Info<?superString>temp){//只能接收String或Object类型的泛型 System.out.print(temp+"、"); } };

泛型无法向上转型

Java代码

classInfo{ privateTvar;//定义泛型变量 public****voidsetVar(Tvar){ this.var=var; } publicTgetVar(){ return****this.var; } publicStringtoString(){//直接打印 return****this.var.toString(); } }; public****classGenericsDemo23{ publicstaticvoidmain(Stringargs[]){ Infoi1=newInfo();//泛型类型为String Infoi2=null; i2=i1;//这句会出错incompatibletypes } };

泛型接口

Java代码

interfaceInfo{//在接口上定义泛型 publicTgetVar();//定义抽象方法,抽象方法的返回值就是泛型类型 } classInfoImplimplementsInfo{//定义泛型接口的子类 privateTvar;//定义属性 publicInfoImpl(Tvar){//通过构造方法设置属性内容 this.setVar(var); } public****voidsetVar(Tvar){ this.var=var; } publicTgetVar(){ return****this.var; } }; public****classGenericsDemo24{ publicstaticvoidmain(Stringarsg[]){ Infoi=null;//声明接口对象 i=newInfoImpl("汤姆");//通过子类实例化对象 System.out.println("内容:"+i.getVar()); } }; ---------------------------------------------------------- interfaceInfo{//在接口上定义泛型 publicTgetVar();//定义抽象方法,抽象方法的返回值就是泛型类型 } classInfoImplimplementsInfo{//定义泛型接口的子类 privateStringvar;//定义属性 publicInfoImpl(Stringvar){//通过构造方法设置属性内容 this.setVar(var); } public****voidsetVar(Stringvar){ this.var=var; } publicStringgetVar(){ return****this.var; } }; public****classGenericsDemo25{ publicstaticvoidmain(Stringarsg[]){ Infoi=null;//声明接口对象 i=newInfoImpl("汤姆");//通过子类实例化对象 System.out.println("内容:"+i.getVar()); } };

泛型方法

Java代码

classDemo{ publicTfun(Tt){//可以接收任意类型的数据 returnt;//直接把参数返回 } }; public****classGenericsDemo26{ publicstaticvoidmain(Stringargs[]){ Demod=newDemo();//实例化Demo对象 Stringstr=d.fun("汤姆");//传递字符串 inti=d.fun(30);//传递数字,自动装箱 System.out.println(str);//输出内容 System.out.println(i);//输出内容 } };

通过泛型方法返回泛型类型实例

Java代码

classInfo<TextendsNumber>{//指定上限,只能是数字类型 privateTvar;//此类型由外部决定 publicTgetVar(){ return****this.var; } public****voidsetVar(Tvar){ this.var=var; } publicStringtoString(){//覆写Object类中的toString()方法 return****this.var.toString(); } }; public****classGenericsDemo27{ publicstaticvoidmain(Stringargs[]){ Infoi=fun(30); System.out.println(i.getVar()); } public****static<TextendsNumber>Infofun(Tparam){//方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定 Infotemp=newInfo();//根据传入的数据类型实例化Info temp.setVar(param);//将传递的内容设置到Info对象的var属性之中 returntemp;//返回实例化对象 } };

使用泛型统一传入的参数类型

Java代码

classInfo{//指定上限,只能是数字类型 privateTvar;//此类型由外部决定 publicTgetVar(){ return****this.var; } public****voidsetVar(Tvar){ this.var=var; } publicStringtoString(){//覆写Object类中的toString()方法 return****this.var.toString(); } }; public****classGenericsDemo28{ publicstaticvoidmain(Stringargs[]){ Infoi1=newInfo(); Infoi2=newInfo(); i1.setVar("HELLO");//设置内容 i2.setVar("汤姆");//设置内容 add(i1,i2); } public****staticvoidadd(Infoi1,Infoi2){ System.out.println(i1.getVar()+""+i2.getVar()); } };

泛型数组

Java代码

public****classGenericsDemo30{ publicstaticvoidmain(Stringargs[]){ Integeri[]=fun1(1,2,3,4,5,6);//返回泛型数组 fun2(i); } public****staticT[]fun1(T...arg){//接收可变参数 returnarg;//返回泛型数组 } public****staticvoidfun2(Tparam[]){//输出 System.out.print("接收泛型数组:"); for(Tt:param){ System.out.print(t+"、"); } } };

泛型的嵌套设置

Java代码

classInfo<T,V>{//接收两个泛型类型 privateTvar; privateVvalue; publicInfo(Tvar,Vvalue){ this.setVar(var); this.setValue(value); } public****voidsetVar(Tvar){ this.var=var; } public****voidsetValue(Vvalue){ this.value=value; } publicTgetVar(){ return****this.var; } publicVgetValue(){ return****this.value; } }; classDemo{ privateSinfo; publicDemo(Sinfo){ this.setInfo(info); } public****voidsetInfo(Sinfo){ this.info=info; } publicSgetInfo(){ return****this.info; } }; public****classGenericsDemo31{ publicstaticvoidmain(Stringargs[]){ Demo<Info<String,Integer>>d=null;//将Info作为Demo的泛型类型 Info<String,Integer>i=null;//Info指定两个泛型类型 i=newInfo<String,Integer>("汤姆",30);//实例化Info对象 d=newDemo<Info<String,Integer>>(i);//在Demo类中设置Info类的对象 System.out.println("内容一:"+d.getInfo().getVar()); System.out.println("内容二:"+d.getInfo().getValue()); } };

泛型方法不一定要通过参数来确定泛型准确类型,可以只通过返回值,比如:

publicstaticArrayListnewArrayList(){

returnnewArrayList();

}

publicListqueryHistories(Longskyid,PrepaidHistoryTypetype,Datefrom,Dateend){

。。。

returnLists.newArrayList();

}

这样Lists.newArrayList();

智能的知道返回类型为PrepaidHistory

本文内容总结:

原文链接:https://www.cnblogs.com/sunwei2012/archive/2010/10/08/1845938.html