2011-03-13 70 views
3

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

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 

任何人都可以帮助我吗?谢谢!

+0

另一件事;似乎没有'max'为空的好理由;事实上,如果人们一次使用你的堆栈的两个实例,你的代码可能会非常灾难性地失败。 – 2011-03-14 01:59:07

+0

您不想使用[Stack] [1]或[Deque] [2]的实现的任何特定原因? [1]:http://download.oracle.com/javase/6/docs/api/java/util/Stack.html [2]:http://download.oracle.com /javase/6/docs/api/java/util/Deque.html – 2011-03-14 01:09:59

回答

3

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))。

+0

我做了这些更改,现在我有以下错误:线程“主”java.lang.ClassCastException:java.lang.Object中的异常无法转换为java.lang.Number at stack.StackArray.pop(StackArray .java:40) at stack.Main.main(Main。java:9) Java结果:1第40行是T aux =(T)(new Object()); – 2011-03-13 23:44:21

+1

你为什么试图创建一个新的对象,然后重新分配变量? Jus做'aux'; - 不需要初始化它(不提这是错误的)。 – 2011-03-14 01:06:24

+0

@Ionut:@Peter是对的。绝对没有理由需要在那里创建一个对象。 – 2011-03-14 01:54:18

0

尝试改变Main.java的第5行是:

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

(或扩展数量,需要你到哪儿去标记StackArray一些其他类型)。

+0

我试过了,它不工作。 – 2011-03-13 23:33:21

0

变化

public void push(Object x) 

public void push(Number x) //or T