|
发表于 2023-11-12 20:11:01
|
显示全部楼层
在Java中,我们可以使用泛型来编写一个通用的栈(Stack)类,这样我们就可以很轻松地用它来存储任何类型的对象。以下是一个基本的泛型栈(GenericStack)类的设计:
- public class GenericStack<E> {
- private E[] elements;
- private int size = 0;
- private static final int DEFAULT_INITIAL_CAPACITY = 16;
- @SuppressWarnings("unchecked")
- public GenericStack() {
- elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
- }
- public void push(E e) {
- if (size == elements.length) {
- E[] temp = elements;
- elements = (E[])new Object[temp.length * 2];
- System.arraycopy(temp, 0, elements, 0, size);
- }
- elements[size++] = e;
- }
- public E pop() {
- if (isEmpty()) {
- return null;
- }
- E value = elements[--size];
- elements[size] = null;
- return value;
- }
- public E peek() {
- if (isEmpty()) {
- return null;
- }
- return elements[size - 1];
- }
- public boolean isEmpty() {
- return size == 0;
- }
- public int getSize() {
- return size;
- }
- }
复制代码
这个GenericStack类使用了Java的泛型参数<E>,这意味着你可以用任何类型来替代E,创建出一个存储特定类型的栈。例如,GenericStack<String>会创建一个存储字符串的栈,而GenericStack<Integer>则会创建一个存储整型的栈。
在这个类中,我们定义了以下几个方法:
- push(E e):将一个元素压入栈顶。如果数组已满,那么数组的容量将被扩大一倍。
- pop():删除并返回栈顶元素。如果栈为空,则返回null。
- peek():返回栈顶元素,但不删除它。如果栈为空,则返回null。
- isEmpty():如果栈为空,则返回true;否则,返回false。
- getSize():返回栈中的元素数量。
注意,为了避免类型擦除问题,我们在构造函数中使用了@SuppressWarnings("unchecked")注解。这是因为Java的泛型是通过类型擦除实现的,这意味着在运行时,泛型类型E会被替换为其上界(这里是Object)。因此,我们不能直接创建一个E类型的数组,而需要创建一个Object类型的数组,然后将其强制转换为E[]。 |
|