[英]Generic Stack Array
我必須實現一個通用堆棧,但是當我嘗試構建項目時,我遇到了一個我無法弄清楚的錯誤。 這是代碼:
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
誰能幫我? 謝謝!
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)
)。
嘗試將Main.java的第5行更改為:
StackArray<Integer> stiva = new StackArray<Integer>(10);
(或者其他一些擴展Number的類型,根據需要將StackArray標記為)。
更改
public void push(Object x)
至
public void push(Number x) //or T
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.