泛型的概念:
所谓泛型,就是允许在定义类、接口时通过一个标识来表示某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如:继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也称为类型实参)。
自定义泛型的结构
1、 泛型的声明:
Interface List和class GenTest
其中,T,K,V不代表值,而是表示类型。这里使用任意字母都可以。
2、 泛型的实例化
一定要在类名后面指定类型参数的值(类型)。如
ListstrList =new ArrayList();
Iterator iterator=customers.iterator();
T只能是类,不能用基本数据类型填充。但可以使用包装类填充。
把一个集合中的内容限制为一个特定的数据类型,这就是genercs背后的核心思想。
3、 自定义泛型的结构:
使用泛型的主要优点是能够在编译时检测错误,而不是在运行时检测错误。
4、自定义泛型结构:泛型类、泛型接口
1、泛型类可能有多个参数,此时应将多个参数一起放在尖括号内,比如:< E1,E2,E3>。
2、泛型类的构造器如下:public GenericClass(){}。
而这个是错误的:public GenericClass(){}
3、实例化后,操作原来泛型位置的结构必须与指定的泛型类型一致。
4泛型不同的引用不能相互赋值。
尽管在编译时ArrayList和ArrayList是两种类型,但是,在运行时只 有一个ArrayList被加载到JVM中。
5泛型如果不稳定,将被拆除,泛型对应的类型都按照Object处理,但不等价与Object。
个人建议:泛型要一直使用,或者就一直不用。
6、如果泛型结构是一个接口或者抽象类,即不可创建泛型类的对象。
7、泛型的指定中不能使用基本数据类型,但是可以使用包装类。
8、在类/接口上声明的泛型,在本类或本接口中即代表某种类型,可以作为非静态属性的类 型、在非静态方法的参数
9、 在类/接口上声明的泛型,在本类或本接口中即代表某种类型,可以作为非静态属性的类型、非静态方法的参数类型、非静态方法的返回值类型。但在静态方法中不能使用类的泛型。
10、异常类不能是泛型的。
11、不能索引使用New E[]。但是可以:E[] elements=(E[])new Object[capacity];
12、父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型:
子类不保留父类的泛型:按需实现:
没有类型 擦除
具体类型
子类保留父类的泛型:泛型子类
全部保留
部分保留
结论:子类除了指定或保留父类的泛型,还可以增加自己的泛型。
泛型方法
1、 方法,也可以被泛型化,不管此时定义在其中的类是不是泛型类。在泛型方法中都可以定义泛型参数,此时,参数的类型就是传入数据的类型。
2、 泛型方法格式:
[访问权限] <泛型> 返回类型 方法名 ({泛型标识 参数名称})抛出的异常
3、 泛型方法声明泛型时也可以指定上限