1.什么是泛型?
-
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
2.泛型的好处
- 1 泛型可以增强编译时错误检测,减少因类型问题引发的运行时异常。
- 2 泛型可以避免类型转换。
- 3 泛型可以泛型算法,增加代码复用性。
3.泛型的分类
Java中的泛型分为三种,泛型类,泛型接口,泛型方法。
- 泛型类:它的定义格式是class name<T1, T2, ..., Tn>,其中一种很常见的做法是定义我们的JavaBean,比如接口返回的json数据,需要和后台定义一个固定的数据返回格式,如下, 返回一个对象中包含了code和一个data, data是一个对象,我们不能固定它是什么类型,这时候就用T泛型来代替,大大增加了代码的复用性。
public class Generics <T> { private T key; private Generics(T key){ //泛型构造方法形参key的类型也为T,T的类型由外部指定 this.key = key; } private T getKey(T key){//泛型方法getKey的返回值类型为T,T的类型由外部指定 return key; } public static void main(String[] args) { Generics g = new Generics(8);//此时T代表整型 System.out.println(g.key);//8 System.out.println(g.getKey(3.14));//3.14,此时TgetKey()方法里面的T就代表浮点数类型 Generics g1 = new Generics("Str");//此时构造方法里面的T代表字符串类型 System.out.println(g1.key);//Str System.out.println(g1.getKey('c'));//c,此时TgetKey()方法里面的T就代表字符类型 } }
- 泛型接口:和泛型类使用相似。
interface Intf <T> {//定义一个泛型接口 public T re(); } class A <T> implements Intf <T> { //A类没有传入泛型实参 @Override public T re() {//默认T的返回值类型为null return null; } } class B implements Intf <String> {//B类传入了泛型实参为String private String[] fruits = new String[]{"Apple", "Banana", "Pear"}; @Override public String re() {//此时T为String类型 Random r = new Random(); return fruits[r.nextInt(3)];//返回值为String类型 } } public class Generics{ public static void main(String[] args) { Intf intf = new B(); System.out.println(intf.re()); Intf intf1 = new A(); System.out.println(intf1.re()); } }
- 泛型方法: 在java中,泛型类的定义非常简单,但是泛型方法就比较复杂了。它的定义是
public static <T> 返回值类型 方法名(T 参数列表)
。只有在前面加<T>
这种的才能算是泛型方法。
注意:泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型 。