本章包含一些如何有效使用泛型的实践代码。着重介绍了检查集合,安全问题,专用的类以及二进制的适配性。
小心使用遗留代码
我们知道,泛型是在编译时检查的,而不是在运行时。通常,这正式我们想要的,因为编译时检查可以更早的报错误,而没有运行时开销。然而,有时候这并不合适,
或者是因为我们不确定编译时检查是否足够(也就是说,我们将传递一个参数化类型的实例给一个我们不信任的遗留的客户端),或者是因为我们需要运行时的类型信息。(也就是说,我们需要一个具体的类型作为数组的元素)。检查集合通常能起到作用,而当它们不能起作用的时候,我们可以创建一个特殊的类。
想象一个遗留类库,该类库包含想给定的列表添加元素,并返回包含这些元素的新列表。
class LegacyLibrary {
public static void addItems(List list) {
list.add(new Integer(1)); list.add("two");
}
public static List getItems() {
List list = new ArrayList();
list.add(new Integer(3)); list.add("four");
return list;
}
}
现在有一个客户端使用这些遗留代码,而且已经被错误的告知里面的元素都是整数。
class NaiveClient {
public static void processItems() {
List<Integer> list = new ArrayList<Integer>();
Legacy Library.addItems(list);
List<Integer> list2 = LegacyLibrary.getItems(); // unchecked
// sometime later ...
int s = 0;
for (int i : list) s += i; // class cast exception
for (int i : list2) s += i; // class cast exception
}
}
待完成