1. 泛型是什么?
定义: 泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时再为参数指明这些类型。
如定义一个类,用<>声明泛型类型,这样的一个类就是泛型类。 
在上述定义中我们没有指定任何的类型,真正的类型在实例化的时候才进行指定,如: List list = new ArrayList<>(); 我给它指定了一个Integer类型。
泛型的本质是参数化类型 ,也就是说操作的数据类型被指定为一个参数(E 类似于形参,传递的是类型)
2. 为什么要用泛型?
现在有一个集合,在没有泛型时传递的数据都是作为Object类进行存储的,如果在其中即存储 int 数据类型,又存储 String、char 等多种数据类型,这样在编译中不会出现错误,但是在实际调用中,就会产生ClassCastException,即类型转换异常错误。   使用泛型的主要目的是加强类型安全及减少类转换的次数。
3. 怎么用泛型?
泛型类
泛型类的定义:  
泛型类对象的实例化: 泛型类在对象实例化的时,才指定数据类型。也就是说,泛型的本质是参数化类型,将类型作为形参进行传递 类名<具体的数据类型> 对象名 = new 类名<具体的数据类型>(); 在Java1.7以后,后面的<>中的具体的数据类型可以省略不写,即:
类名<具体的数据类型> 对象名 = new 类名<>();`
注意事项:
- 泛型类,如果没有指定具体的数据类型,此时操作类型是Object
- 泛型的类型参数只能是类类型(如Integer、Character等),不能是基本数据类型(如int、char等
- 泛型类型在逻辑上可以看成是多个不同的类型(在逻辑上是不同数据类型的类),但实际上都是相同类型(都是指定的泛型类,这一点通过重载可以看出来)

泛型类的继承

泛型接口
 泛型接口的实现:
- 实现类不是泛型类,接口要明确数据类型;
 - 实现类也是泛型类,实现类和接口的泛型类型(T/E/…)要一致,但是可以进行泛型扩充。
 
泛型方法
 定义一个泛型方法: 
泛型与可变参数: 可变参数: 当调用方法时,方法的参数个数或类型未知时,称其为可变参数列表。 
注意:
类型通配符
定义: 类型通配符用 ? 代替具体的类型实参,表示可以传递任何类型,因此类型通配符是类型实参,而不是类型形参。 
类型通配符的上限: 类型通配符的上限限制了传入的参数类型只能是该上限或者该上限的子类。   
类型通配符的下限: 类型通配符的下限限制了传入的参数类型只能是该下限或者该下限的父类。 
泛型擦除
泛型擦除: 泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉 ,我们称之为泛型(类型)擦除。
泛型与反射

|