泛型数组表(Java语言)¶
朴素数组表(Java语言) 中实现的 数组表 ,只能处理 int 类型数据,很局限。
如果语言不支持泛型编程( Generic Programming ),就只能再为其他类型重写一遍了。 好在 Java 支持泛型编程,有能力实现一个同时支持多种数据类型的数组表。 具体如何实现呢?
泛型化¶
泛型编程的思想是,在实现类或方法时,暂时不指定类型,而是稍后再决定使用什么类型。 为达到这个目的,需要借助 类型参数 ,位于类名之后,以尖括号括住:
1 2 3 4 | public class GenericArrayList<AnyType> {
private int listSize;
private AnyType[] listItems;
}
|
这段代码表明, GenericArrayList 是一个泛型类,关联类型暂不确定, AnyType 为类型参数。 之后,修改相关类方法,将类型参数化。
由于数组类型暂不确定,我们需要将其换成 类型参数 。 第 3 行表示,该类有一个成员变量 listItems ,类型是一个数组,但数据类型暂不确定。 如果实例化 GenericArrayList 对象时指定了 int 类型,那么 listItems 就是一个 int 数组。
类方法也需要以类型参数代替固定类型,以构造函数为例:
1 2 3 4 | public GenericArrayList(int capacity) {
listItems = (AnyType[]) new Object[capacity];
listSize = 0;
}
|
构造函数比较特殊,需要创建底层数组。 由于 Java 不支持动态创建数组,需要创建 Object 数组并做类型转换。
一般方法,只需简单替换,例如 set 方法:
1 2 3 4 5 6 7 8 9 10 11 12 | public AnyType set(int idx, AnyType newVal) {
// index out of bounds
if (idx < 0 || idx >= size()) {
throw new ArrayIndexOutOfBoundsException();
}
// store old value for returning
AnyType oldVal = listItems[idx];
listItems[idx] = newVal;
return oldVal;
}
|
最后,创建该类对象时,通过尖括号确定实际类型。
例如,创建一个存储整数的数组表对象:
1 | GenericArrayList<Integer> list = new GenericArrayList<Integer>(10);
|
例如,创建一个存储整数的数组表对象:
1 | GenericArrayList<String> strlist = new GenericArrayList<String>(10);
|