泛型
1.为什么使用泛型?
jdk5.0以前,对象保存到集合中就会失去其特性,取出时通常要进行强类型的强制转换,这样不可避免就会引发一些安全性问题。
2.泛型举例
List<String>list=new ArrayList<String>();
在泛型里面写的是一个类对象,如String,不能写基本的数据类型,如int,要写基本数据类型对应的包装类
byte -- Byte
short -- Short
int -- Integer
long -- Long
float -- Float
double -- Double
char -- Character
boolean – Boolean
3.泛型类
3.1概述
泛型类:具有一个或多个类型变量的类,称为泛型类
classA<T> {
}
3.2特点
在创建泛型类实例时,需要为其类型变量赋值;如果不赋值,会有警告
A<String> a=new A<String>();
4.泛型方法
4.1 概述
泛型方法:具有一个或多个类型变量的方法,称为泛型方法
4.2 举例
classB {
public static <T> void add(T t){}
}
classC {
public <T> T update(T t){}
}
注意:类D中的test方法不是泛型方法
classD<T> {
public T test(T t){//test方法不是泛型方法
}
}
4.3 泛型类与泛型方法
泛型类和泛型方法之间没有必然联系,泛型方法不一定非要在泛型类中!
5. 泛型的应用
5.1 泛型在方法中的应用
-- 使用条件:方法逻辑相同,只是数据类型不同,这时候使用泛型方法
-- public static <T> void swap(T[]arr, int i, int j) {
T temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
5.2 泛型在类上的应用
-- 在一个类上定义一个类型,这个类型可以在类里面直接使用
-- public class Test <T>{
T t;
}
-- 在类上面定义的泛型,不能再静态方法种使用
总结:泛型类中使用泛型
成员变量
返回值和参数
局部变量
classDemo<T> {
private T flag;//泛型在成员变量上使用
public T fun(T t){//泛型在类中的方法(返回值和参数)上使用 }
public T judge(){
T t=…;//泛型在局部变量上使用
//new T();//报错,不可以这样使用!
}
}
6 泛型的继承和实现
classA<T> {}
classAA extends A<String> {}//AA不是泛型类,只是继承了泛型类!
* 继承泛型类时,有两种情况:
(1)子类不是泛型类,需要给父类传递类型常量
classAA1 extends A<Integer> {}
(2)子类是泛型类,可以给父类传递类型常量,也可以传递类型变量
classAA2<T> extends A<T> {}
7. 泛型的通配符(?)
“?”表示一个不确定的类型,其值在调用时确定
通配符只能出现在左边,即不能再new时出现通配符,如:
List<?>list=new ArrayList<String>();
List<?extends Object> list=new ArrayList<String>();
7.1 使用场景
一般用在方法的形参上
7.2 通配符的优点
使方法更加通用
7.3 通配符的分类
无界通配:?
子类通配:? extends Object
父类通配:? Super Integer
8 泛型擦除
泛型只是出现在源代码阶段,编译之后泛型就不存在了