1.慨念
     泛型(generic)是指可以参数化类型,可以使我们在编译时而不是运行时检测出错误。定义带泛型类型的类或方  法后编译器会用具体的类型来替换他。
     <T> 表示形式泛型类型,随后可以用一个具体的实际类型来替换,即泛型实例化。
2.注意
     【1】泛型类型必须是引用类型。
     【2】可以为类或者接口定义泛型,但在声明引用变量是必须指定具体的类型。
     【3】可以不使用泛型,但使用泛型可以提高软件的可靠性和可读性(编译时检测错误)。
     【4】泛型类有多个参数时用逗号隔开如:<E1,E2,E3>。
     【5】可以为静态方法定义泛型方法:public static E void print(E e){}。
          调用时使用:类名.<具体类型>方法名(参数);或者直接:方法名(参数)。
     【6】将泛型指定为另一种类型的子类型,即受限的泛型类型如:<E extends Person>
          非受限泛型类型等同于<E extends Object>。 
 3.原始类型
       没有指定具体类型的泛型类和泛型接口被称为原始类型,用于早期的java版本向后兼容。原始类型是不安全的。
 4.通配泛型
       可以使用非受限通配,受限通配或者下限通配来对一个泛型类型指定范围。
       ? : 非受限通配,相当于? extends Object
       ? extends T : 受限通配,表示T或T的子类型
       super T : 下限通配,表示T或T的父类型
 5.泛型消除
       编译器可以使用的泛型信息在运行时是不可用的,即泛型存在于编译时,一旦编译器确定泛型类型是安全可用的就将它转换成原始类型。
       泛型类被它所有实例所共享。
 6.对泛型的限制
       【1】 不能使用 new E() ,不能使用泛型类型参数创建实例。
       【2】 不能使用 new E[] ,不能使用泛型类型参数创建数组(可以通过类型转换来使用)。
       【3】 在静态上下文中不允许累的参数是泛型类型。泛型类的所有实例都有相同的运行时类即泛型类的静态变量
             和方法被其所有实例所共享,因此在静态方法,数据域或初始化语句中不能引用泛型类型参数。
       【4】 异常类不能是泛型的。因为在运行时泛型类型信息不可得。