java 泛型详解
本文内容纲要:
普通泛型
Java代码
- classPoint
{//此处可以随便写标识符号,T是type的简称 - privateTvar;//var的类型由T指定,即:由外部指定
- publicTgetVar(){//返回值的类型由外部决定
- returnvar;
- }
- public****voidsetVar(Tvar){//设置的类型也由外部决定
- this.var=var;
- }
- };
- public****classGenericsDemo06{
- publicstaticvoidmain(Stringargs[]){
- Point
p=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[]){
- Info
i=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[]){
- Info
i1=newInfo ();//声明Integer的泛型对象 - Info
i2=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[]){
- Info
i1=newInfo ();//声明String的泛型对象 - Info
- 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[]){
- Info
i1=newInfo ();//泛型类型为String - Info
i2=null; - i2=i1;//这句会出错incompatibletypes
- }
- };
泛型接口
Java代码
- interfaceInfo
{//在接口上定义泛型 - publicTgetVar();//定义抽象方法,抽象方法的返回值就是泛型类型
- }
- classInfoImpl
implementsInfo {//定义泛型接口的子类 - privateTvar;//定义属性
- publicInfoImpl(Tvar){//通过构造方法设置属性内容
- this.setVar(var);
- }
- public****voidsetVar(Tvar){
- this.var=var;
- }
- publicTgetVar(){
- return****this.var;
- }
- };
- public****classGenericsDemo24{
- publicstaticvoidmain(Stringarsg[]){
- Info
i=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{
- public
Tfun(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[]){
- Info
i=fun(30); - System.out.println(i.getVar());
- }
- public****static<TextendsNumber>Info
fun(Tparam){//方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定 - Info
temp=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[]){
- Info
i1=newInfo (); - Info
i2=newInfo (); - i1.setVar("HELLO");//设置内容
- i2.setVar("汤姆");//设置内容
- add(i1,i2);
- }
- public****static
voidadd(Info i1,Info i2){ - System.out.println(i1.getVar()+""+i2.getVar());
- }
- };
泛型数组
Java代码
- public****classGenericsDemo30{
- publicstaticvoidmain(Stringargs[]){
- Integeri[]=fun1(1,2,3,4,5,6);//返回泛型数组
- fun2(i);
- }
- public****static
T[]fun1(T...arg){//接收可变参数 - returnarg;//返回泛型数组
- }
- public****static
voidfun2(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());
- }
- };
泛型方法不一定要通过参数来确定泛型准确类型,可以只通过返回值,比如:
publicstatic
returnnewArrayList
}
publicList
。。。
returnLists.newArrayList();
}
这样Lists.newArrayList();
智能的知道返回类型为PrepaidHistory
本文内容总结:
原文链接:https://www.cnblogs.com/sunwei2012/archive/2010/10/08/1845938.html