文档

Java™ 教程-Java Tutorials 中文版
兼容性
Trail: Collections
Lesson: Interoperability

兼容性

Java 集合框架旨在确保核心 集合接口 与用于在 Java 平台早期版本中表示集合的类型之间的完全互操作性:VectorHashtablearrayEnumeration。在本节中,你将学习如何将旧集合转换为 Java 集合框架集合,反之亦然。

向上兼容性

假设你正在使用一个返回旧集合 API,该 API 与另一个需要实现集合接口的对象的 API 一起使用。为了使两个 API 顺利地互操作,你必须将旧版集合转换为现代集合。幸运的是,Java 集合框架使这很容易。

假设旧 API 返回一个对象数组,新 API 需要 Collection。集合框架有一个便利实现,允许将数组对象视为 List。使用 Arrays.asList 将数组传递给需要 CollectionList 的任何方法。

Foo[] result = oldMethod(arg);
newMethod(Arrays.asList(result));

如果旧 API 返回 VectorHashtable,则根本没有工作要做,因为 Vector 被改进以实现 List 接口且 Hashtable 进行了改进,以实现 Map。因此,Vector 可以直接传递给任何调用 CollectionList 的方法。

Vector result = oldMethod(arg);
newMethod(result);

类似地,Hashtable 可以直接传递给任何调用 Map 的方法。

Hashtable result = oldMethod(arg);
newMethod(result);

不太常见的是,API 可能会返回表示对象集合的 EnumerationCollections.list 方法将 Enumeration 转换为 Collection

Enumeration e = oldMethod(arg);
newMethod(Collections.list(e));

向后兼容性

假设你正在使用一个返回现代集合 API,该 API 与另一个要求你传入旧集合的 API 一起使用。要使两个 API 平滑地互操作,你必须将现代集合转换为旧集合。同样,Java 集合框架使这一过程变得简单。

假设新 API 返回 Collection,旧 API 需要 Object 数组。你可能知道,Collection 接口包含为此情况明确设计的 toArray 方法。

Collection c = newMethod();
oldMethod(c.toArray());

如果旧 API 需要 String(或其他类型)数组而不是 Object 数组,该怎么办?你只需使用另一种形式的 toArray — 在输入上采用数组的那个。

Collection c = newMethod();
oldMethod((String[]) c.toArray(new String[0]));

如果旧 API 需要 Vector,则标准集合构造函数会派上用场。

Collection c = newMethod();
oldMethod(new Vector(c));

旧 API 需要 Hashtable 的情况类似地处理。

Map m = newMethod();
oldMethod(new Hashtable(m));

最后,如果旧 API 需要 Enumeration,你会怎么做?这种情况并不常见,但它确实经常发生,并且提供了 Collections.enumeration 方法来处理它。这是一个静态工厂方法,它接受 Collection 并在 Collection 的元素上返回 Enumeration

Collection c = newMethod();
oldMethod(Collections.enumeration(c));

Previous page: Interoperability
Next page: API Design