Apple和Orange都放在了容器里,将它们取出后都发生了运行时异常,因为这个示例没有使用泛型。
Apple和Orange类是不一样的,它们除了都是Object之外没有其他的共性。(如果一个类没有显示地声明继承哪个类,那么它自动继承Object)。因为ArrayList保存的是Object,因此可以通过ArrayList的add()方法将Apple对象放进容器中,Orange对象也可以添加。但当使用ArrayList的get()方法取出Apple的对象时,得到的只是Object引用,必须将其强制转型为Apple,否则就会得到语法错误。
import java.util.*;
class Apple {
private static long counter;
final long id = counter++;
public long id() {
return id;
}
}
class Orange {
}
public class 泛型 {
public static void main(String[] args) {
ArrayList apples = new ArrayList();
for (int i = 0; i < 3; i++)
apples.add(new Apple());
apples.add(new Object());
for (int i = 0; i < apples.size(); i++)
((Apple) apples.get(i)).id();
}
}
可以声明Arra,而不仅仅是ArrayList,<>括起来的是类型参数(可以有多个),它指定了这个容器实例可以保存的类型。通过使用泛型,可以在编译时期防止将错误类型的对象放置到容器中。加泛型之后,编译器就会阻止Orange放入Apple中,这就变成了一个编译期错误。
将元素从List中取出时,类型转换不在是必须的了,以为List知道它保存的是什么类型,因此在调用get()是自动执行转型。这样在使用时更加清楚。