Java泛型该怎么使用

看的视频中虽然已经讲出了,但是还是希望有字面的解释能容易理解些,具体泛型怎么用,希望指点。

弑天下
浏览 1040回答 1
1回答

动漫人物

具体使用方法~1、定义泛型类在定义带泛型的类时,在紧跟类命之后的 < >内,指定一个或多个泛型的名字,同时也可以对泛型的取值范围进行限定,多个泛型之间用,号分隔。定义完泛型后,可以在定义位置之后的类的几乎任意地方(静态块,静态属性,静态方法除外)使用泛型,就像使用普通的类型一样。注意,父类定义的泛型不能被子类继承。例://自定义一个泛型 public&nbsp;class&nbsp;MyGenerics&nbsp;<T1,T2&nbsp;>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;T1&nbsp;param1;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;T2&nbsp;param2;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;T1&nbsp;getParam1()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;param1;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setParam1(T1&nbsp;param1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.param1&nbsp;=&nbsp;param1;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;T2&nbsp;getParam2()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;param2;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setParam2(T2&nbsp;param2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.param2&nbsp;=&nbsp;param2;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;} }使用自定义的泛型:public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//使用自定义的泛型 &nbsp;&nbsp;&nbsp;&nbsp;MyGenerics&nbsp;<Integer,&nbsp;String&nbsp;>&nbsp;myGenerics&nbsp;=&nbsp;new&nbsp;MyGenerics&nbsp;<Integer,&nbsp;String&nbsp;>(); &nbsp;&nbsp;&nbsp;&nbsp;myGenerics.setParam1(1); &nbsp;&nbsp;&nbsp;&nbsp;myGenerics.setParam2("abc"); }注意:如果一个泛型函数在一个泛型类里面出现,最好避免在方法的泛型和类的泛型中使用同样的名字来避免混淆。对内部类也是同样。2、定义带泛型方法在定义带泛型的方法时,在紧跟可见范围修饰(例如public)之后的 < >内,指定一个或多个泛型的名字,同时也可以对泛型的取值范围进行限定,多个泛型之间用,号分隔。&nbsp;定义完泛型后,可以在定义位置之后的方法的任意地方使用泛型,就像使用普通的类型一样。&nbsp;例如:&nbsp;public&nbsp;<T,&nbsp;S&nbsp;extends&nbsp;T&nbsp;>&nbsp;T&nbsp;testGenericMethodDefine(T&nbsp;t,&nbsp;S&nbsp;s){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;}&nbsp;注意:定义带泛型的方法,主要目的是为了表达多个参数以及返回值之间的关系。3、通配符类型的通配声明:可以使用“?”通配字元,并使用extends关键字限定持有者的类型。声明一个类型时进行限定:例:public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//使用’?’通配字元,并使用extends关键字限定持有者的类型 &nbsp;&nbsp;&nbsp;&nbsp;MyGenerics&nbsp;<?&nbsp;extends&nbsp;Object,&nbsp;?&nbsp;extends&nbsp;List&nbsp;<String&nbsp;>&nbsp;>&nbsp;myGenerics&nbsp;=&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//创建满足类型要求的对象&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;myGenerics&nbsp;=&nbsp;new&nbsp;MyGenerics&nbsp;<String,&nbsp;ArrayList&nbsp;<String&nbsp;>&nbsp;>();&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//以下是不符合通配要求的因为HashMap没有实现List&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//myGenerics&nbsp;=&nbsp;new&nbsp;MyGenerics&nbsp;<String,&nbsp;HashMap&nbsp;>();&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//给泛型的泛型赋值&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;MyGenerics3&nbsp;<?&nbsp;extends&nbsp;Object,&nbsp;?&nbsp;extends&nbsp;List&nbsp;<String&nbsp;>&nbsp;>&nbsp;myGenerics3&nbsp;=&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;myGenerics3&nbsp;=&nbsp;new&nbsp;MyGenerics3&nbsp;<Object,&nbsp;List&nbsp;<String&nbsp;>&nbsp;>();&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;//可以设置为null&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;myGenerics3.setMyGenerics(null); } MyGenerics3&nbsp;<?,&nbsp;?&nbsp;>&nbsp;myGenerics3&nbsp;=&nbsp;null;等价于:MyGenerics3&nbsp;<?&nbsp;extends&nbsp;Object,&nbsp;?&nbsp;extends&nbsp;Object&nbsp;>&nbsp;myGenerics5&nbsp;=&nbsp;null;4、数组范型可以使用带范型参数值的类声明数组,却不可有创建数组,不能使用new关键字创建T类型的对象,而应该传递一个具体的参数类型,如下面的将编译不通过:MyGenerics&nbsp;<Integer,&nbsp;String&nbsp;>&nbsp;myGenerics&nbsp;=&nbsp;new&nbsp;MyGenerics&nbsp;<T1,&nbsp;T2&nbsp;>();例:public&nbsp;class&nbsp;MyGenerics2&nbsp;<T&nbsp;>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;T[]&nbsp;param1;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;T[]&nbsp;getParam1()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;param1;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setParam1(T[]&nbsp;param1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.param1&nbsp;=&nbsp;param1;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}5、使用泛型的好处:如果使用了泛型,只要代码在编译时没有出现警告信息,就不会遇到运行时的ClassCastException异常。
打开App,查看更多内容
随时随地看视频慕课网APP