Compatibility

Java Collections Framework 旨在确保核心collection interfaces与早期 Java 版本中用于表示集合的类型VectorHashtablearrayEnumeration之间具有完全的互操作性。在本部分中,您将学习如何将旧的集合转换为 Java Collections Framework 集合,反之亦然。

Upward Compatibility

假设您正在使用一个 API,该 API 与另一个需要对象实现集合interface的 APIString 联返回旧集合。为了使这两个 API 顺利互操作,您必须将旧版收藏转换为现代收藏。幸运的是,Java Collections Framework 使这变得容易。

假设旧的 API 返回一个对象数组,而新的 API 需要一个Collection。 Collections Framework 具有便利的实现,该实现允许将对象数组视为List。您可以使用Arrays.asList将数组传递给需要CollectionList的任何方法。

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

如果旧的 API 返回VectorHashtable,那么您根本就不需要做任何工作,因为Vector被改装为实现Listinterface,而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));

Backward Compatibility

假设您使用的 API 会一并返回现代收藏,而另一个 API 则要求您传入旧收藏。为了使两个 API 顺利互操作,您必须将现代集合转换为旧集合。同样,Java Collections Framework 使这变得容易。

假设新 API 返回Collection,而旧 API 需要Object数组。您可能已经知道,Collectioninterface包含专门针对这种情况设计的toArray方法。

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

如果旧的 API 需要一个String(或其他类型)的数组而不是Object的数组怎么办?您只需要使用toArray的另一种形式-一种在 Importing 中采用数组的形式。

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));