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

Share:
12,306
Ionut Ungureanu
Author by

Ionut Ungureanu

Updated on June 04, 2022

Comments

  • Ionut Ungureanu
    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!