什么是泛型
java5开始出现的一种对Java语言类型的一种拓展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数类型时指定的类型占位符,就好比方法的形式参数是实际参数的占位符一样。
泛型能保证大型应用程序的类型安全和良好的维护性;
使用泛型的优势:类型安全,使编译器对泛型定义的类型做判断限制.如保证TreeSet里的元素类型必须一致; 消除强制类型的转换,如,使用Comparable比较时每次都需要类型强转;
泛型类
在类声明时通过一个标志符表示类中某个字段的类型或者某个方法的返回值或参数的类型,这样在类声明或实例化的时候只要指定自己需要的类型就ok。
声明多个泛型类型
若一个类中多个字段需要不同的泛型声明,则在声明类的时候指定多个泛型类型即可;
通配符
在进行引用传递的时候泛型类型必须匹配才可以传递,否则编译不通过;
使用 ? ,表示未知类型的泛型对象:
List<?> 表示未知元素的List集合;
这种带通配符的List仅表示各种泛型List的父类,并不能把元素添加入集合中; List<?> list = new ArrayList<>();
list.add(1); //ERROR
public void show(List<?> list){} //表示可接受任意类型的List集合
泛型的上限与下限
设置泛型对象的上限使用extends,表示参数类型只能是该类型或该类型的子类;
设置泛型对象的下限使用super,表示参数类型只能是该类型或该类型的父类;
泛型和子类继承的限制
对象的多态性,我们可以
父类 对象 = new 子类();
但是在父类泛型类型和子泛型类型之间不存在这种关系:
类<Number> 对象 = new 类<Integer>();×
泛型接口
java5后,可以声明泛型接口,声明方式和声明泛型类是一样的。
public interface IDAO<T>{}
泛型接口子类有两种方式:
直接在子类后申明泛型;在子类实现的接口中给出具体的泛型类型
泛型方法
方法中可定义泛型参数,形参的参数类型就是实参的类型。
泛型的擦除
在严格的泛型代码里,带泛型声明的类总应该带着类型参数。但是为了和老的Java代码保持一致,也允许在使用带泛型声明的类时不指定类型参数,若没有为这个泛型类指定类型参数则该类型参数被称做一个原始类型,默认是该声明参数时指定的最上限类型;
当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时,则所有在尖括号之间的类型信息都被扔掉。
比如List<String> 类型转换成List,则该List对集合元素的类型检查变成了变量的上限即Object。
什么是泛型
java5开始出现的一种对Java语言类型的一种拓展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数类型时指定的类型占位符,就好比方法的形式参数是实际参数的占位符一样。
泛型能保证大型应用程序的类型安全和良好的维护性;
使用泛型的优势:类型安全,使编译器对泛型定义的类型做判断限制.如保证TreeSet里的元素类型必须一致; 消除强制类型的转换,如,使用Comparable比较时每次都需要类型强转;
泛型类
在类声明时通过一个标志符表示类中某个字段的类型或者某个方法的返回值或参数的类型,这样在类声明或实例化的时候只要指定自己需要的类型就ok。
声明多个泛型类型
若一个类中多个字段需要不同的泛型声明,则在声明类的时候指定多个泛型类型即可;
通配符
在进行引用传递的时候泛型类型必须匹配才可以传递,否则编译不通过;
使用 ? ,表示未知类型的泛型对象:
List<?> 表示未知元素的List集合;
这种带通配符的List仅表示各种泛型List的父类,并不能把元素添加入集合中; List<?> list = new ArrayList<>();
list.add(1); //ERROR
public void show(List<?> list){} //表示可接受任意类型的List集合
泛型的上限与下限
设置泛型对象的上限使用extends,表示参数类型只能是该类型或该类型的子类;
设置泛型对象的下限使用super,表示参数类型只能是该类型或该类型的父类;
泛型和子类继承的限制
对象的多态性,我们可以
父类 对象 = new 子类();
但是在父类泛型类型和子泛型类型之间不存在这种关系:
类<Number> 对象 = new 类<Integer>();×
泛型接口
java5后,可以声明泛型接口,声明方式和声明泛型类是一样的。
public interface IDAO<T>{}
泛型接口子类有两种方式:
直接在子类后申明泛型;在子类实现的接口中给出具体的泛型类型
泛型方法
方法中可定义泛型参数,形参的参数类型就是实参的类型。
泛型的擦除
在严格的泛型代码里,带泛型声明的类总应该带着类型参数。但是为了和老的Java代码保持一致,也允许在使用带泛型声明的类时不指定类型参数,若没有为这个泛型类指定类型参数则该类型参数被称做一个原始类型,默认是该声明参数时指定的最上限类型;
当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时,则所有在尖括号之间的类型信息都被扔掉。
比如List<String> 类型转换成List,则该List对集合元素的类型检查变成了变量的上限即Object。