1.概念
java中类型的参数化,用一个变量来表示某种类型。
2.引入泛型解决的问题
<1>在编译期间进行类型检查,避免出现classCastException(类型转换异常)
<2>避免进行强制类型转换
<3>避免重复代码的编写,实现复用。
3.泛型在集合类中的的应用
对于ArrayList:
不使用泛型时,此时默认是Object类型:
public class Test1 {
public static void main(String[] args) {
ArrayList a1=new ArrayList();
a1.add("hll");
a1.add(1);
String s=(String)a1.get(0);
String s2=(String)a1.get(1);//在运行时会出现类型转换异常
}
}
上述代码进行了强制类型转换,且在编译期间不会出现类型转换异常,在运行时会出现类型转换异常
添加泛型后:
ArrayList<String> a1=new ArrayList<String>();
a1.add("hll");
a1.add(1);//编译时就会报错
String s=a1.get(0);//不必进行强制类型转换
4.自定义泛型类
public class Test1<T extends Comparable> {
public int CompareTo(T a,T b){
return a.compareTo(b);
}
public static void main(String[] args) {
Test1 t=new Test1();
System.out.println(t.CompareTo(1,3));
}
}
类型擦除:在执行的过程中,会去掉泛型的类型,用确定的类型来代替。如上面的比较大小的代码,T最后会用Comparable代替,类型擦除后的代码为:
public class Test1{
public int CompareTo(Comparable a,Comparable b){
return a.compareTo(b);
}
public static void main(String[] args) {
Test1 t=new Test1();
System.out.println(t.CompareTo(1,3));
}
}
泛型注意的几点
1.泛型的类型不能用基本类型代替,例如:
ArrayList<int> s=new ArrayList<int>();
是错误的写法
2.泛型间父子继承关系,例如
ArrayList<Object> t=new ArrayList<Integer>();
是错误的写法
泛型定义前后必须统一一致