一、泛型
泛型是JDK1.5,新添加的特性,其作用是对集合进行“参数化类型”,在JDK1.5之前,还没有泛型这一概念,集合中的元素是Object类型,所以,每次使用集合中的元素时,需要将元素向下造型成对应类型才能使用,错误的可能性很大,非常的不方便。为了简化操作,提高效率,便有了泛型这一新特性,有了泛型,集合就可以规定元素的类型,编译器会在集合进行增删操作时,检查元素类型是否匹配,避免了很多错误。同时在JDK1.5中添加了自动装箱/拆箱的特性,这些新特性使开发者能够更高效的使用集合。
集合框架中的所有类型都添加了泛型机制。
二、泛型的使用
(1) 如何定义泛型?
只需要在定义类时,在类名后添加<E>或<E,A,B>即可,可以添加多个泛型。
如:
public class ArrayList<E>{
public E get(int index){
}
}
public class Person<K,V>{
private K k;
private V v;
public K getK(){return k;}
public void setK(K k){this.k = k;}
}
(2)泛型和方法形参比较
定义时:
public class ArrayList<E>{}
public void sum(String str1,String str2){}
泛型是在类名后定义,形参是在方法名后定义。
使用时:
ArrayList<Integer> list = new ArrayList<Integer>();
将参数E赋值为引用类型Integer。
sum("abc","123");
将具体值赋给对应的形参。
(3)定义一个可灵活使用的类
public class Person<K,V> {
private K k;
private V v;
public Person(K k,V v){
this.k=k;
this.v=v;
}
public K getK() {
return k;
}
public void setK(K k) {
this.k = k;
}
public V getV() {
return v;
}
public void setV(V v) {
this.v = v;
}
}
定义一个有两个泛型属性的类,并提供构造器和get/set方法,在之后使用这个类时,对属性的使用会更加灵活。
假如我想存两个人的姓名和成绩,那么我可以将Person的泛型分别定义为String和Double类型。
Person<String, Double> p1 = new Person<String, Double>("张三", 99.0);
Person<String, Double> p2 = new Person<String, Double>("李四", 98.0);
假如我又想存第三个人的国籍和城市,那么我可以将Person的泛型定义为String和String类型。
Person<String, String> p3 = new Person<String, String>("中国","上海");
所以,采用泛型机制,可以使类变得更加灵活。