泛型程序设计(Generic programming) 意味着编写的代码可以被很多不同类型的对象所重用
在增加泛型类之前,ArrayList类只维护一个Object引用的数组:
public class ArrayList {
private Object[] elementData;
...
public Object get(int i) {...}
public void add(Object o) {...}
}
而这会产生两个问题:
【1】获取一个值时必须进行强制类型转换:
ArrayList files = new ArrayList();
// 输入后将以Object的形式保存
files.add("e://fatmanhappycoding.txt");
// 将获取到的Object转化成String
String filename = (String)files.get(0);
【2】没有错误检查,可以向数组列表添加任何类的对象
往本来应该存放String的files中加入文件对象
files.add(new File("..."));
这么做在编译和运行都不会出错
但是在使用时我看不出来这个files到底是存放了String类型的对象还是File还是其他的什么对象,所以在使用时很可能会对存放了File类型对象的files执行:
String filename = (String)files.get(1); // 里面存放了File对象
此时就会产生错误
所以,泛型提供了一个解决方案:类型参数:
ArrayList<String> files = new ArrayList<String>();
这样提高了可读性,使我们一看就知道里面存放了String对象
在Java SE 7后我们可以这样写: ArrayList< String>files = new ArrayList<>();
例:
public class ArrayList<T> {
private T[] elementData;
...
public T get(int i) {...}
public void add(T t) {...}
}
使用上面例子中采用泛型的ArrayList:
ArrayList<String> files = new ArrayList<>();
String filename = files.get(0);
此时不用进行转换,编译器通过get方法的类型参数便知道了这是String型的,add也同理,因此,现在用add来向files添加File类型的对象则会报错
因此,泛型使得程序有更好的可读性和安全性
注:本文为《Java 核心技术 卷I》读书笔记及个人理解解释