【问题标题】:Generic Stack Array通用堆栈数组
【发布时间】:2011-07-14 16:03:42
【问题描述】:

我必须实现一个通用堆栈,但是当我尝试构建项目时,我遇到了一个我无法弄清楚的错误。代码如下:

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

谁能帮助我?谢谢!

【问题讨论】:

标签: java arrays generics stack


【解决方案1】:

T[]erasureNumber[],因为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))。

【讨论】:

  • 我已经进行了这些更改,现在出现以下错误:线程“main”中的异常 java.lang.ClassCastException:java.lang.Object 无法在堆栈中强制转换为 java.lang.Number .StackArray.pop(StackArray.java:40) at stack.Main.main(Main.java:9) Java 结果:1 第 40 行是 T aux=(T)(new Object());
  • 为什么尝试创建一个新对象然后重新分配变量?只需T aux; - 无需初始化它(更不用说它是错误的)。
  • @Ionut:@Peter 是对的。绝对没有理由需要在那里创建一个对象。
  • @Peter Knego:谢谢!这就是问题所在。我已更改为简单的 T aux 并开始工作。问题解决了!
  • @Ionut:有什么理由不想使用Java提供的StackArrayDeque
【解决方案2】:

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

StackArray&lt;Integer&gt; stiva = new StackArray&lt;Integer&gt;(10);

(或其他扩展 Number 的类型,根据需要,您已将 StackArray 标记为 )。

【讨论】:

    【解决方案3】:

    改变

    public void push(Object x)
    

    public void push(Number x) //or T
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 2015-07-02
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 2015-08-17
      相关资源
      最近更新 更多