通用堆栈数组

4
我需要实现一个通用的栈,但是当我尝试构建项目时,出现了一个错误,我无法解决。以下是代码:
Stack.java -> 接口
package stack;

public interface Stack <T> {
    public boolean isEmpty();
    public boolean isFull();
    public void push(T x) throws StackFullException;
    public boolean offer(T x);
    public T pop() throws StackEmptyException;
    public T poll();
    public T peek() throws StackEmptyException;
    public T element();
}

StackArray.java -> 这是接口的实现

package stack;

public class StackArray <T extends Number> implements Stack {
    static int max;
    private int nr;
    private T[] stack;

    public StackArray(int size){
        nr=0;
        stack=(T[])(new Object[size]);
        max=size;
    }
    public boolean isEmpty() {
        if (nr<=0)
            return true;
        return false;
    }
    public boolean isFull() {
        if (nr==max-1)
            return true;
        return false;
    }
    public void push(Object x) throws StackFullException{
        if(isFull())
            throw new StackFullException();
        else
            stack[nr++]=(T)x;
    }
    public boolean offer(Object x) {
        if(isFull())
            return false;
        else
        {
            stack[nr++]=(T)x;
            return true;
        }
    }

    public T pop() throws StackEmptyException {
        T aux=(T)(new Object());
        if(isEmpty())
            throw new StackEmptyException();
        else
            {
                aux=stack[nr];
                stack[nr]=null;
                nr--;
                return aux;
            }
        }

    public T poll() {
        T aux=(T)(new Object());
        if(isEmpty())
            return null;
        else
        {
             aux=stack[nr];
             stack[nr]=null;
             nr--;
             return aux;
        }

    }

    public T peek() throws StackEmptyException {
        if(isEmpty())
            throw new StackEmptyException();
        else
            return stack[nr];
    }

    public T element() {
        if(isEmpty())
            return null;
        else
            return stack[nr];
    }

}

主类如下:

package stack;

public class Main {
    public static void main(String[] args) throws StackFullException, StackEmptyException {
        StackArray stiva=new StackArray(10);
        for(int i=1; i<10; i++)
            stiva.push(i);
        for(int i=1; i<10; i++)
            System.out.print(stiva.pop()+" ");
    }

}

当我尝试构建该项目时,我收到了以下错误:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Number;
        at stack.StackArray.<init>(StackArray.java:10)
        at stack.Main.main(Main.java:5)
Java Result: 1

有人能帮助我吗?谢谢!


你不想使用Stack或者Deque的实现有什么特别的原因吗? - Peter Knego
还有一件事; max 似乎没有很好的理由为空; 实际上,如果人们同时使用两个实例的堆栈,您的代码可能会相当灾难性地失败。 - Mark Peters
3个回答

3

擦除T[]擦除为Number[],因为T的上界是Number。因此你的stack实际上被声明为Number[]而不是Object[]。在你的构造函数中,你试图将一个Object[]赋值给stack。改为创建一个Number[]

stack=(T[])(new Number[size]);

作为旁注,你可能想要

public class StackArray <T extends Number> implements Stack<T>

你不应该实现原始版本的类。因此,你需要更新其他方法(例如,用push(T)代替push(Object))。

我已经进行了这些更改,现在出现了以下错误:Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot be cast to java.lang.Number at stack.StackArray.pop(StackArray.java:40) at stack.Main.main(Main.java:9) Java Result: 1 第40行是 T aux=(T)(new Object()); - Ionut Ungureanu
1
为什么要创建一个新对象然后重新分配变量?只需执行 T aux; - 无需初始化它(更不用说这是错误的)。 - Peter Knego
@Ionut:@Peter 是对的。你完全没有必要在那里创建一个对象。 - Mark Peters
@Peter Knego:谢谢!那就是问题所在。我改成了简单的T aux,现在可以工作了。问题解决了! - Ionut Ungureanu
@IonutпјљдЅ дёЌжѓідЅїз”ЁJavaжЏђдѕ›зљ„Stackж€–ArrayDequeжњ‰д»Ђд№€еЋџе› еђ—пјџ - Peter Knego
@Peter:这是一份作业。我的老师告诉我要按照这种方式实现堆栈...为了教育目的。 - Ionut Ungureanu

0

更改

public void push(Object x)

返回。
public void push(Number x) //or T

0

尝试将Main.java的第5行更改为:

StackArray<Integer> stiva = new StackArray<Integer>(10);

(或者根据你在StackArray标记的要求,使用其他扩展Number类型的类型)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接