Generic Stack Array
12,306
The erasure of T[]
is Number[]
because the upper bound of T
is Number
. Thus your stack
is really declared as a Number[]
not an Object[]
. In your constructor you are trying to assign an Object[]
to stack
. Create a Number[]
instead.
stack=(T[])(new Number[size]);
As an aside, you probably want
public class StackArray <T extends Number> implements Stack<T>
You shouldn't implement the raw version of the class. As a consequence you'll need to update other methods (e.g. push(T)
instead of push(Object)
).
Author by
Ionut Ungureanu
Updated on June 04, 2022Comments
-
Ionut Ungureanu almost 2 years
I have to implement a generic stack, but when I try to build the project I have an error that I can't figure out. Here's the code:
Stack.java -> interface
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 -> the implementation of the interface
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]; } }
And the main class:
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()+" "); } }
When I try to build the project I receive the following error:
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
Can anyone help me? Thanks!