Java泛型详解:<T>和Class<T>的使用。泛型类 - 腾讯云

文章推薦指數: 80 %
投票人數:10人

Java泛型详解:和Class的使用。

泛型类,泛型方法的详细使用实例. 2020-12-01 22:27:46. 最初发布时间:2020-12-01 19:36:10. 阅读5150. 腾讯云备案控制台腾讯云开发者社区专栏问答沙龙团队主页TVP搜索搜索关闭创作写文章发视频提问登录注册展开腾讯云·社区登录首页专栏问答沙龙团队主页TVP返回腾讯云官网用户78861501.6K篇文章Java泛型详解:和Class的使用。

泛型类,泛型方法的详细使用实例转到我的清单专栏首页bit哲学院Java泛型详解:和Class的使用。

泛型类,泛型方法的详细使用实例50分享分享文章到朋友圈分享文章到QQ分享文章到微博复制文章链接到剪贴板海报分享海报分享Java泛型详解:和Class的使用。

泛型类,泛型方法的详细使用实例修改于2020-12-0214:27:46阅读5170参考链接:Java中的main()函数是强制性的吗一、引入 1、泛型是什么 首先告诉大家ArrayList就是泛型。

那ArrayList能完成哪些想不到的功能呢?先看看下面这段代码:  [java]   viewplain  copy  ArrayListstrList=newArrayList();  ArrayListintList=newArrayList();  ArrayListdoubleList=newArrayList();  大家对ArrayList很熟悉,这里构造了三个List,分别盛装String、Integer和Double;这就是ArrayList的过人之处:即各种类型的变量都可以组装成对应的List,而不必针对每个类型分别实现一个构建ArrayList的类。

这里可能看不懂,开篇总是困难的,下面看看如果没有泛型的话,我们要怎么做;2、没有泛型会怎样 先看下面这段代码:我们实现两个能够设置点坐标的类,分别设置Integer类型的点坐标和Float类型的点坐标:  [java]   viewplain  copy  //设置Integer类型的点坐标  classIntegerPoint{    privateIntegerx;    //表示X坐标    privateIntegery;    //表示Y坐标    publicvoidsetX(Integerx){      this.x=x;    }    publicvoidsetY(Integery){      this.y=y;    }    publicIntegergetX(){      returnthis.x;    }    publicIntegergetY(){      returnthis.y;    }  }  //设置Float类型的点坐标  classFloatPoint{    privateFloatx;    //表示X坐标    privateFloaty;    //表示Y坐标    publicvoidsetX(Floatx){      this.x=x;    }    publicvoidsetY(Floaty){      this.y=y;    }    publicFloatgetX(){      returnthis.x;    }    publicFloatgetY(){      returnthis.y;    }  }  那现在有个问题:大家有没有发现,他们除了变量类型不一样,一个是Integer一个是Float以外,其它并没有什么区别!那我们能不能合并成一个呢?答案是可以的,因为Integer和Float都是派生自Object的,我们用下面这段代码代替:  [java]   viewplain  copy  classObjectPoint{    privateObjectx;    privateObjecty;    publicvoidsetX(Objectx){      this.x=x;    }    publicvoidsetY(Objecty){      this.y=y;    }    publicObjectgetX(){      returnthis.x;    }    publicObjectgetY(){      returnthis.y;    }  }  即全部都用Object来代替所有的子类;在使用的时候是这样的:  [java]   viewplain  copy  ObjectPointintegerPoint=newObjectPoint();  integerPoint.setX(newInteger(100));  IntegerintegerX=(Integer)integerPoint.getX();  在设置的时候,使用newInteger(100)来新建一个Integer  [java]   viewplain  copy  integerPoint.setX(newInteger(100));  然后在取值的时候,进行强制转换:  [java]   viewplain  copy  IntegerintegerX=(Integer)integerPoint.getX();  由于我们设置的时候,是设置的Integer,所以在取值的时候,强制转换是不会出错的。

同理,FloatPoint的设置和取值也是类似的,代码如下:  [java]   viewplain  copy  ObjectPointfloatPoint=newObjectPoint();  floatPoint.setX(newFloat(100.12f));  FloatfloatX=(Float)floatPoint.getX();  但问题来了:注意,注意,我们这里使用了强制转换,我们这里setX()和getX()写得很近,所以我们明确的知道我们传进去的是Float类型,那如果我们记错了呢?比如我们改成下面这样,编译时会报错吗:  [java]   viewplain  copy  ObjectPointfloatPoint=newObjectPoint();  floatPoint.setX(newFloat(100.12f));  StringfloatX=(String)floatPoint.getX();  不会!!!我们问题的关键在于这句:  [java]   viewplain  copy  StringfloatX=(String)floatPoint.getX();  强制转换时,会不会出错。

因为编译器也不知道你传进去的是什么,而floatPoint.getX()返回的类型是Object,所以编译时,将Object强转成String是成立的。

必然不会报错。

而在运行时,则不然,在运行时,floatPoint实例中明明传进去的是Float类型的变量,非要把它强转成String类型,肯定会报类型转换错误的!那有没有一种办法在编译阶段,即能合并成同一个,又能在编译时检查出来传进去类型不对呢?当然,这就是泛型。

下面我们将对泛型的写法和用法做一一讲解。

二、各种泛型定义及使用 1、泛型类定义及使用 我们先看看泛型的类是怎么定义的:  [java]   viewplain  copy  //定义  classPoint{//此处可以随便写标识符号    privateTx;       privateTy;       publicvoidsetX(Tx){//作为参数      this.x=x;    }    publicvoidsetY(Ty){      this.y=y;    }    publicTgetX(){//作为返回值      returnthis.x;    }    publicTgetY(){      returnthis.y;    }  };  //IntegerPoint使用  Pointp=newPoint();  p.setX(newInteger(100));  System.out.println(p.getX());    //FloatPoint使用  Pointp=newPoint();  p.setX(newFloat(100.12f));  System.out.println(p.getX());   先看看运行结果:从结果中可以看到,我们实现了开篇中IntegerPoint类和FloatPoint类的效果。

下面来看看泛型是怎么定义及使用的吧。

  (1)、定义泛型:Point首先,大家可以看到Point,即在类名后面加一个尖括号,括号里是一个大写字母。

这里写的是T,其实这个字母可以是任何大写字母,大家这里先记着,可以是任何大写字母,意义是相同的。

(2)类中使用泛型这个T表示派生自Object类的任何类,比如String,Integer,Double等等。

这里要注意的是,T一定是派生于Object类的。

为方便起见,大家可以在这里把T当成String,即String在类中怎么用,那T在类中就可以怎么用!所以下面的:定义变量,作为返回值,作为参数传入的定义就很容易理解了。

    [java]   viewplain  copy  //定义变量  privateTx;  //作为返回值  publicTgetX(){    returnx;   }   //作为参数  publicvoidsetX(Tx){     this.x=x;   }   (3)使用泛型类下面是泛型类的用法:  [java]   viewplain  copy  //IntegerPoint使用  Pointp=newPoint();  p.setX(newInteger(100));  System.out.println(p.getX());    //FloatPoint使用  Pointp=newPoint();  p.setX(newFloat(100.12f));  System.out.println(p.getX());   首先,是构造一个实例:  [java]   viewplain  copy  Pointp=newPoint();   这里与普通构造类实例的不同之点在于,普通类构造函数是这样的:Pointp=newPoint(); 而泛型类的构造则需要在类名后添加上,即一对尖括号,中间写上要传入的类型。

因为我们构造时,是这样的:classPoint,所以在使用的时候也要在Point后加上类型来定义T代表的意义。

然后在getVar()和setVar()时就没有什么特殊的了,直接调用即可。

从上面的使用时,明显可以看出泛型的作用,在构造泛型类的实例的时候:  [java]   viewplain  copy  //IntegerPoint使用  Pointp=newPoint();  //FloatPoint使用  Pointp=newPoint();   尖括号中,你传进去的是什么,T就代表什么类型。

这就是泛型的最大作用,我们只需要考虑逻辑实现,就能拿给各种类来用。

前面我们提到ArrayList也是泛型,我们顺便它的实现:  [java]   viewplain  copy  publicclassArrayList{    …………  }  看到了吧,跟我们的Point实现是一样的,这也就是为什么ArrayList能够盛装各种类型的主要原因。

(4)使用泛型实现的优势相比我们开篇时使用Object的方式,有两个优点:(1)、不用强制转换  [java]   viewplain  copy  //使用Object作为返回值,要强制转换成指定类型  FloatfloatX=(Float)floatPoint.getX();  //使用泛型时,不用强制转换,直接出来就是String  System.out.println(p.getVar());   (2)、在settVar()时如果传入类型不对,编译时会报错可以看到,当我们构造时使用的是String,而在setVar时,传进去Integer类型时,就会报错。

而不是像Object实现方式一样,在运行时才会报强制转换错误。

  2、多泛型变量定义及字母规范 (1)、多泛型变量定义上在我们只定义了一个泛型变量T,那如果我们需要传进去多个泛型要怎么办呢?只需要在类似下面这样就可以了:  [java]   viewplain  copy  classMorePoint{  }  也就是在原来的T后面用逗号隔开,写上其它的任意大写字母即可。

想加几个就加几个,比如我们想加五个泛型变量,那应该是这样的:   [java]   viewplain  copy  classMorePoint{  }  举个粟子,我们在Point上再另加一个字段name,也用泛型来表示,那要怎么做?代码如下:  [java]   viewplain  copy  classMorePoint{    privateTx;    privateTy;         privateUname;     publicvoidsetX(Tx){      this.x=x;    }    publicTgetX(){      returnthis.x;    }    …………    publicvoidsetName(Uname){      this.name=name;    }     publicUgetName(){      returnthis.name;    }  }  //使用  MorePointmorePoint=newMorePoint();  morePoint.setName("harvic");  Log.d(TAG,"morPont.getName:"+morePoint.getName());  从上面的代码中,可以明显看出,就是在新添加的泛型变量U用法与T是一样的。

(2)、字母规范在定义泛型类时,我们已经提到用于指定泛型的变量是一个大写字母:  [java]   viewplain  copy  classPoint{  …………  }  当然不是的!!!!任意一个大写字母都可以。

他们的意义是完全相同的,但为了提高可读性,大家还是用有意义的字母比较好,一般来讲,在不同的情境下使用的字母意义如下: E—Element,常用在javaCollection里,如:List,Iterator,SetK,V—Key,Value,代表Map的键值对N—Number,数字T—Type,类型,如String,Integer等等 如果这些还不够用,那就自己随便取吧,反正26个英文字母呢。

再重复一遍,使用哪个字母是没有特定意义的!只是为了提高可读性!!!!3、泛型接口定义及使用 在接口上定义泛型与在类中定义泛型是一样的,代码如下:   [java]   viewplain  copy  interfaceInfo{    //在接口上定义泛型     publicTgetVar();//定义抽象方法,抽象方法的返回值就是泛型类型     publicvoidsetVar(Tx);  }   与泛型类的定义一样,也是在接口名后加尖括号;(1)、使用方法一:非泛型类但是在使用的时候,就出现问题了,我们先看看下面这个使用方法:    [java]   viewplain  copy  classInfoImplimplementsInfo{  //定义泛型接口的子类    privateStringvar;        //定义属性    publicInfoImpl(Stringvar){    //通过构造方法设置属性内容      this.setVar(var);    }    @Override    publicvoidsetVar(Stringvar){      this.var=var;    }    @Override    publicStringgetVar(){      returnthis.var;    }  }   publicclassGenericsDemo24{    public voidmain(Stringarsg[]){      InfoImpli=newInfoImpl("harvic");      System.out.println(i.getVar());    }  };  首先,先看InfoImpl的定义:  [java]   viewplain  copy  classInfoImplimplementsInfo{    …………  }  要清楚的一点是InfoImpl不是一个泛型类!因为他类名后没有!然后在在这里我们将Info中的泛型变量T定义填充为了String类型。

所以在重写时setVar()和getVar()时,IDE会也我们直接生成String类型的重写函数。

最后在使用时,没什么难度,传进去String类型的字符串来构造InfoImpl实例,然后调用它的函数即可。

  [java]   viewplain  copy  publicclassGenericsDemo24{    public voidmain(Stringarsg[]){      InfoImpli=newInfoImpl("harvic");      System.out.println(i.getVar());    }  };  (2)、使用方法二:泛型类在方法一中,我们在类中直接把Info接口给填充好了,但我们的类,是可以构造成泛型类的,那我们利用泛型类来构造填充泛型接口会是怎样呢?   [java]   viewplain  copy  interfaceInfo{    //在接口上定义泛型    publicTgetVar();//定义抽象方法,抽象方法的返回值就是泛型类型    publicvoidsetVar(Tvar);  }  classInfoImplimplementsInfo{  //定义泛型接口的子类    privateTvar;       //定义属性    publicInfoImpl(Tvar){   //通过构造方法设置属性内容      this.setVar(var);     }    publicvoidsetVar(Tvar){      this.var=var;    }    publicTgetVar(){      returnthis.var;    }  }  publicclassGenericsDemo24{    publicstaticvoidmain(Stringarsg[]){      InfoImpli=newInfoImpl("harvic");      System.out.println(i.getVar());    }  };  最关键的是构造泛型类的过程:  [java]   viewplain  copy  classInfoImplimplementsInfo{  //定义泛型接口的子类    privateTvar;       //定义属性    publicInfoImpl(Tvar){   //通过构造方法设置属性内容      this.setVar(var);     }    publicvoidsetVar(Tvar){      this.var=var;    }    publicTgetVar(){      returnthis.var;    }  }  在这个类中,我们构造了一个泛型类InfoImpl,然后把泛型变量T传给了Info,这说明接口和泛型类使用的都是同一个泛型变量。

然后在使用时,就是构造一个泛型类的实例的过程,使用过程也不变。

  [java]   viewplain  copy  publicclassGenericsDemo24{    publicstaticvoidmain(Stringarsg[]){      Infoi=newInfoImpl("harvic");      System.out.println(i.getVar());    }  };  使用泛型类来继承泛型接口的作用就是让用户来定义接口所使用的变量类型,而不是像方法一那样,在类中写死。

那我们稍微加深点难度,构造一个多个泛型变量的类,并继承自Info接口:  [java]   viewplain  copy  classInfoImplimplementsInfo{  //定义泛型接口的子类    privateUvar;      privateTx;    privateKy;    publicInfoImpl(Uvar){    //通过构造方法设置属性内容      this.setVar(var);    }    publicvoidsetVar(Uvar){      this.var=var;    }    publicUgetVar(){      returnthis.var;    }  }  在这个例子中,我们在泛型类中定义三个泛型变量T,K,U并且把第三个泛型变量U用来填充接口Info。

所以在这个例子中Info所使用的类型就是由U来决定的。

使用时是这样的:泛型类的基本用法,不再多讲,代码如下:  [java]   viewplain  copy  publicclassGenericsDemo24{    public voidmain(Stringarsg[]){      InfoImpli=newInfoImpl("harvic");      System.out.println(i.getVar());    }  }  4、泛型函数定义及使用 上面我们讲解了类和接口的泛型使用,下面我们再说说,怎么单独在一个函数里使用泛型。

比如我们在新建一个普通的类StaticFans,然后在其中定义了两个泛型函数:  [java]   viewplain  copy  publicclassStaticFans{    //静态函数    publicstatic voidStaticMethod(Ta){      Log.d("harvic","StaticMethod:"+a.toString());    }    //普通函数    public voidOtherMethod(Ta){      Log.d("harvic","OtherMethod:"+a.toString());    }  }  上面分别是静态泛型函数和常规泛型函数的定义方法,与以往方法的唯一不同点就是在返回值前加上来表示泛型变量。

其它没什么区别。

使用方法如下:  [java]   viewplain  copy  //静态方法  StaticFans.StaticMethod("adfdsa");//使用方法一  StaticFans.StaticMethod("adfdsa");//使用方法二   //常规方法  StaticFansstaticFans=newStaticFans();  staticFans.OtherMethod(newInteger(123));//使用方法一  staticFans.OtherMethod(newInteger(123));//使用方法二  结果如下:首先,我们看静态泛型函数的使用方法:    [java]   viewplain  copy  StaticFans.StaticMethod("adfdsa");//使用方法一  StaticFans.StaticMethod("adfdsa");//使用方法二  从结果中我们可以看到,这两种方法的结果是完全一样的,但他们还有些区别的,区别如下:方法一,可以像普通方法一样,直接传值,任何值都可以(但必须是派生自Object类的类型,比如String,Integer等),函数会在内部根据传进去的参数来识别当前T的类别。

但尽量不要使用这种隐式的传递方式,代码不利于阅读和维护。

因为从外观根本看不出来你调用的是一个泛型函数。

方法二,与方法一不同的地方在于,在调用方法前加了一个来指定传给的值,如果加了这个来指定参数的值的话,那StaticMethod()函数里所有用到的T类型也就是强制指定了是String类型。

这是我们建议使用的方式。

同样,常规泛型函数的使用也有这两种方式:  [java]   viewplain  copy  StaticFansstaticFans=newStaticFans();  staticFans.OtherMethod(newInteger(123));//使用方法一  staticFans.OtherMethod(newInteger(123));//使用方法二  可以看到,与平常一样,先创建类的实例,然后调用泛型函数。

方法一,隐式传递了T的类型,与上面一样,不建议这么做。

方法二,显示将T赋值为Integer类型,这样OtherMethod(Ta)传递过来的参数如果不是Integer那么编译器就会报错。

进阶:返回值中存在泛型上面我们的函数中,返回值都是void,但现实中不可能都是void,有时,我们需要将泛型变量返回,比如下面这个函数:  [java]   viewplain  copy  publicstaticListparseArray(Stringresponse,Classobject){    ListmodelList=JSON.parseArray(response,object);    returnmodelList;  }  函数返回值是List类型。

至于传入参数Classobject的意义,我们下面会讲。

这里也就是想通过这个例子来告诉大家,泛型变量其实跟String,Integer,Double等等的类的使用上没有任何区别,T只是一个符号,可以代表String,Integer,Double……这些类的符号,在泛型函数使用时,直接把T看到String,Integer,Double……中的任一个来写代码就可以了。

唯一不同的是,要在函数定义的中在返回值前加上标识泛型;5、其它用法:Class类传递及泛型数组 (1)、使用Class传递泛型类Class对象有时,我们会遇到一个情况,比如,我们在使用JSON解析字符串的时候,代码一般是这样的  [java]   viewplain  copy  publicstaticListparseArray(Stringresponse){    ListmodelList=JSON.parseArray(response,SuccessModel.class);    returnmodelList;  }  其中SuccessModel是自定义的解析类,代码如下,其实大家不用管SuccessModel的定义,只考虑上面的那段代码就行了。

写出来SuccessModel的代码,只是不想大家感到迷惑,其实,这里只是fastJson的基本用法而已。

这段代码的意义就是根据SuccessModel解析出List的数组。

  [java]   viewplain  copy  publicclassSuccessModel{    privatebooleansuccess;       publicbooleanisSuccess(){      returnsuccess;    }     publicvoidsetSuccess(booleansuccess){      this.success=success;    }  }   那现在,我们把下面这句组装成一个泛型函数要怎么来做呢?  [java]   viewplain  copy  publicstaticListparseArray(Stringresponse){    ListmodelList=JSON.parseArray(response,SuccessModel.class);    returnmodelList;  }  首先,我们应该把SuccessModel单独抽出来做为泛型变量,但parseArray()中用到的SuccessModel.class要怎么弄呢?先来看代码:  [java]   viewplain  copy  publicstaticListparseArray(Stringresponse,Classobject){    ListmodelList=JSON.parseArray(response,object);    returnmodelList;  }  注意到,我们用的Classobject来传递类的class对象,即我们上面提到的SuccessModel.class。

这是因为Class也是一泛型,它是传来用来装载类的class对象的,它的定义如下:  [java]   viewplain  copy  publicfinalclassClassimplementsSerializable{    …………  }  通过Class来加载泛型的Class对象的问题就讲完了,下面来看看泛型数组的使用方法吧。

(2)、定义泛型数组在写程序时,大家可能会遇到类似String[]list=newString[8];的需求,这里可以定义String数组,当然我们也可以定义泛型数组,泛型数组的定义方法为T[],与String[]是一致的,下面看看用法:   [java]   viewplain  copy  //定义  publicstaticT[]fun1(T...arg){ //接收可变参数      returnarg;      //返回泛型数组   }   //使用  publicstaticvoidmain(Stringargs[]){      Integeri[]=fun1(1,2,3,4,5,6);     Integer[]result=fun1(i);  }   我们先看看定义时的代码:  [java]   viewplain  copy  publicstaticT[]fun1(T...arg){ //接收可变参数      returnarg;      //返回泛型数组   }   首先,定义了一个静态函数,然后定义返回值为T[],参数为接收的T类型的可变长参数。

如果有同学对T...arg的用法不了解,可以去找下JAVA可变长参数方面的知识。

由于可变长参数在输入后,会保存在arg这个数组中,所以,我们直接把数组返回即可。

转自:http://blog.csdn.net/harvic880925/article/details/49872903 下面是我自己实际使用泛型的几个实例。

希望看完上面的文章之后,再看实际使用的例子,可以更好的理解和使用和实际使用。

关于泛型类的使用实例 importlombok.Data;@DatapublicclassMultiObject{  /**    *成功状态   */  privatebooleansuccess;  /**   *异常   */  privateExceptionex;  /**   *数据   */  privateTobj;  publicMultiObject(){   }   /**    *注意:当传入的泛型是Boolean时,就和第三个构造函数冲突了。

   */   publicMultiObject(booleansuccess){     this.success=success;   }   publicMultiObject(Exceptionex){     this.success=false;     this.ex=ex;   }   publicMultiObject(Tvalue){     this.success=true;     this.obj=value;   } }简单解释下这个model。

 在实际业务代码里面,可能有很多种操作,然后我们关心这个操作的执行结果,主要有几点。

 1,成功与否。

对应属性success。

 2,异常信息。

对应属性ex。

若是操作正常执行,则就不在意这个属性的值。

 3,我们操作的最终目的对象。

对应属性obj。

  泛型牛逼的地方就是在这个地方。

如果你不用泛型,而使用Object类型,那么每次执行完之后,我们即使得到这个结果,还得类型转换一下,那么这下就像文章上面描述的那样。

分分钟出现castfailexception。

也就是类型转换异常啦。

但是,若是使用了这个泛型之后,那么我们的某个操作所需要的返回结果是什么类型,就可以传入什么类型,而且在实际取得返回结果的时候,就不需要使用类型转换,这样就很好的达到了目的。

这个主要是代码设计层次的提高。

写再多的业务代码,要是不提高,那么写的都是渣。

 关于,这个model代码里面为啥没有getter和setter,都是因为使用@Data这个注解,可以自动填充这个getter和setter。

所以。

就表在意这个问题啦。

在其他地方可以正常使用各个属性getter和setter方法,虽然这些方法,你暂时看不见。

有兴趣的可以了解下lombok。

  关于泛型方法的使用实例这个地方就有2个,但是上面文章也都讲到啦。

 1,一个是泛型表示某一个类型的参数。

为的传递某一类的参数对象 2,另一个则是传递的不是参数,而是代表Class,某一个类。

恰巧我都使用过,就正好记录一下实际使用实例。

   /**   *将Json字符串信息转换成对应的Java对象   *   *@paramjsonjson字符串对象   *@paramc  对应的类型   */  publicstaticTparseJsonToObj(Stringjson,Classc){    try{      JSONObjectjsonObject=JSONObject.parseObject(json);      returnJSON.toJavaObject(jsonObject,c);    }catch(Exceptione){      LOG.error(e.getMessage());    }    returnnull;  }然后是具体调用的地方的代码。

 CollectorcollectorObj=JSONUtils.parseJsonToObj(collector,Collector.class);Flumeflume=JSONUtils.parseJsonToObj(flumeJson,Flume.class);Probeprobe=JSONUtils.parseJsonToObj(probeJson,Probe.class);可以看到,真的只是因为传入的参数类型不一样,但若你不知道泛型的话,那你就得没遇到一个类型的转换,你就得写一个这么个方法。

   /**   *@paramdest  目的集合   *@paramsource源集合   *@param  集合参数的类型   */  privatestaticvoidlistAddAllAvoidNPE(Listdest,Listsource){    if(source==null){      return;    }    dest.addAll(source);  }  privatestaticvoidlistAddAvoidNull(Listdest,Tsource){    if(source==null){      return;    }    dest.add(source);  } 这个就是传入的参数为某一类的参数,主要是要使用参数对象,而不是上面的那个使用的参数的类Class  我这方法提出来,主要是因为,直接使用list类的addAll()方法,如果添加的是null,那么就会抛异常。

但是总不能我在所有使用的地方,都判断一下我要添加的参数是不是null,然后再调用list的addAll()方法吧。

那样的话,这样的判断代码会啰嗦的海了去了。

所以,就这么提出来了。

 这个时候,这个T,使用起来就像使用我们常用的一般对象一样,我这的参数是个List类型,当然也可是其他类型的,姿势都一样。

 然后是具体调用的地方的代码   Listlist=Lists.newArrayList();   listAddAllAvoidNPE(list,decoder.getProperties());这个方法的第二个参数的返回值可能是null,所以,直接调用addAll(),就会抛空指针异常。

所以,就如上,那么一提取。

就好多啦。

展开阅读全文本文转载自:https://blog.csdn.net/qq_27093465/article/details/73229016?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160688007019195283028242%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=160688007019195283028242&biz_id=0&utm_medium=distribute.pc_search_result.non复制如有侵权,请联系[email protected]删除。

C++Java编程算法举报点赞5分享登录后参与评论0条评论泛型类、泛型方法、类型通配符的使用    你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。

根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

泰斗贤若如java泛型(一)、泛型的基本介绍和使用http://blog.csdn.net/lonelyroamer/article/details/7864531bear_fishJAVA泛型类的使用在工作流(workflow)中,存在着各种各样的工作流程,这些流程呢有一些特征——1.流程基本信息相同2.流程内容不同小小明童鞋Java中泛型的详细解析,深入分析泛型的使用方式可以发现,在编译过后,程序会采取去泛型化措施.也就是说,Java中的泛型,只在编译阶段有效.在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象...攻城狮ChovaJava泛型的局限和使用经验泛型的局限泛型的常用经验参考资料//使用泛型类@Data@Builder@AllArgsConstructor@NoArgsConstructorpublicclassData...阿杜JAVA泛型通配符T,E,K,V区别,T以及Class,Class>的区别总结下泛型的好处就是 省去了强制转换,可以在编译时候检查类型安全,可以用在类,方法,接口上 Java编程指南java泛型通配符?extendsT和?superT的区别和用法?extendsT:表示上界是T,?都是继承自T的,都是T的子类; ?superT:表示下界是T,?都是T的父类;IT云清Java泛型的学习和使用贾博岩java泛型通配符?extendsT和?superT的区别和用法https://www.cnblogs.com/chyu/p/4630798.html挨踢小子部落阁java泛型类的定义和封装实例为了让一个java类在不同的类型都能在程序中调用,我们常常会将此类定义为泛型类,重要特点是:类的作用是通用的,仅此我们需要传入的类型不一样。

爱明依Java中泛型的介绍和使用我们都知道Java里的集合(list,map....)是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成Object类型。

当我们在取出每一个对...框架师Java泛型详解——绝对是对泛型方法讲解最详细的,没有之一!ArrayList可以存放任意类型,例子中添加了一个String类型,添加了一个Integer类型,再使用时都以String的方式使用,因此程序崩溃了。

为了解决...Spark学习技巧Java泛型详解——绝对是对泛型方法讲解最详细的,没有之一!ArrayList可以存放任意类型,例子中添加了一个String类型,添加了一个Integer类型,再使用时都以String的方式使用,因此程序崩溃了。

为了解决...Java团长java之学习泛型的概述和基本使用吾爱乐享声明方法java实际开发中泛型使用需要注意的一些问题在写这篇文章之前,xxx已经写过了几篇关于改声明方法主题的文章,想要了解的朋友可以去翻一下之前的文章全栈程序员站长C++核心准则T.5:结合使用泛型和面向对象技术应该增强它们的效果而不是成本GenericandOOtechniquesarecomplementary.面向对象思考最详细的java泛型详解Tanyboye泛型程序设计当程序调用泛型类型,如果擦除返回类型,编译器将插入强制类型转换 Pairbuddies=.. Employeebuddy=...用户2436820彻底搞懂泛型泛型是Java中的高级概念,也是构建框架必备技能,比如各种集合类都是泛型实现的,今天详细聊聊Java中的泛型概念,希望有所收获。

记得点赞,关注,分享哦。

香菜聊游戏更多文章用户7886150关注专栏文章1.6K阅读量646.8K获赞2.9K腾讯云原生专题云原生技术干货,业务实践落地。

云安全最佳实践-创作者计划火热征文中,发布文章赢千元好礼!立即查看腾讯云自媒体分享计划入驻腾讯云开发者社区,共享百万资源包。

立即入驻广告关闭社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于视频介绍社区规范免责声明联系我们友情链接归档问题归档专栏文章归档快讯文章归档关键词归档开发者手册归档开发者手册Section归档腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN加速视频通话图像分析MySQL数据库SSL证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright©2013-2022TencentCloud.AllRightsReserved.腾讯云版权所有京公网安备11010802017518粤B2-20090059-1扫描二维码扫码关注腾讯云开发者领取腾讯云代金券



請為這篇文章評分?