泛型数组表(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);

下一步

订阅更新,获取更多学习资料,请关注我们的 微信公众号

../../_images/wechat-mp-qrcode.png

小菜学编程

微信打赏