Compatibility
Java Collections Framework 旨在确保核心collection interfaces与早期 Java 版本中用于表示集合的类型Vector,Hashtable,array和Enumeration之间具有完全的互操作性。在本部分中,您将学习如何将旧的集合转换为 Java Collections Framework 集合,反之亦然。
Upward Compatibility
假设您正在使用一个 API,该 API 与另一个需要对象实现集合interface的 APIString 联返回旧集合。为了使这两个 API 顺利互操作,您必须将旧版收藏转换为现代收藏。幸运的是,Java Collections Framework 使这变得容易。
假设旧的 API 返回一个对象数组,而新的 API 需要一个Collection
。 Collections Framework 具有便利的实现,该实现允许将对象数组视为List
。您可以使用Arrays.asList将数组传递给需要Collection
或List
的任何方法。
Foo[] result = oldMethod(arg);
newMethod(Arrays.asList(result));
如果旧的 API 返回Vector
或Hashtable
,那么您根本就不需要做任何工作,因为Vector
被改装为实现List
interface,而Hashtable
被改装为实现Map
。因此,Vector
可以直接传递给任何调用Collection
或List
的方法。
Vector result = oldMethod(arg);
newMethod(result);
同样,Hashtable
可以直接传递给任何需要Map
的方法。
Hashtable result = oldMethod(arg);
newMethod(result);
API 可能不常返回代表对象集合的Enumeration
。 Collections.list
方法将Enumeration
转换为Collection
。
Enumeration e = oldMethod(arg);
newMethod(Collections.list(e));
Backward Compatibility
假设您使用的 API 会一并返回现代收藏,而另一个 API 则要求您传入旧收藏。为了使两个 API 顺利互操作,您必须将现代集合转换为旧集合。同样,Java Collections Framework 使这变得容易。
假设新 API 返回Collection
,而旧 API 需要Object
数组。您可能已经知道,Collection
interface包含专门针对这种情况设计的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));