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】 异常类不能是泛型的。因为在运行时泛型类型信息不可得。
泛型(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】 异常类不能是泛型的。因为在运行时泛型类型信息不可得。