概述
泛型是JDK5.0之后推出的新特性,用泛型可以指定集合当中存储的数据类型。泛型这种机制,只在程序编译阶段起作用,只是给编译器参考的。(运行阶段泛型没用!)
我们还是以实例代码来说明吧,下面是没有使用泛型的代码:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class genericTest{
public static void main(String[] args) {
List list = new ArrayList();
Cat cat = new Cat();
Bird bird = new Bird();
list.add(cat);
list.add(bird);
Iterator it = list.iterator();
while(it.hasNext()){
Object obj = it.next();
if(obj instanceof Animal){
Animal a = (Animal) obj;
a.move();
}
}
}
}
class Animal{
public void move(){
System.out.println("动物在移动!");
}
}
class Cat extends Animal{
public void catchMouce(){
System.out.println("猫抓老鼠!");
}
}
class Bird extends Animal{
public void birdFly(){
System.out.println("小鸟在飞翔!");
}
}
没有使用泛型之前,在调用集合内元素并且使用其方法的时候,需要判断类型,并且要强制类型转换,这样才能使用相应的元素方法,很明显这样略显复杂。接着再比较看看使用泛型的代码:
public static void main(String[] args) {
List<Animal> list = new ArrayList<Animal>();
Cat cat = new Cat();
Bird bird = new Bird();
list.add(cat);
list.add(bird);
Iterator<Animal> it = list.iterator();
while(it.hasNext()){
Animal a = it.next();
a.move();
}
}
}
相较之下,使用泛型之后的代码量减少了,并且对于集合内元素的操作就比较简单了。
另外需要指出的是,在JDK8之后,引入了自动类型推断机制(又称为钻石表达式),具体使用方法请看代码:
List<Animal> list = new ArrayList<>();//可以省略掉后面尖括号内的类型
总结
使用泛型的好处:
- 集合中存储的元素类型统一了;
- 从集合中取出的元素类型是泛型指定的类型,不需要进行大量的“向下转型”!
缺点:
导致集合中存储的元素缺乏多样性。