Универсальный массив стеков - PullRequest
4 голосов
/ 14 марта 2011

Мне нужно реализовать общий стек, но когда я пытаюсь построить проект, у меня возникает ошибка, которую я не могу понять.Вот код:

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

Кто-нибудь может мне помочь?Спасибо!

Ответы [ 3 ]

3 голосов
/ 14 марта 2011

стирание из 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)).

0 голосов
/ 14 марта 2011

Изменение

public void push(Object x)

до

public void push(Number x) //or T
0 голосов
/ 14 марта 2011

Попробуйте изменить строку 5 в Main.java следующим образом:

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

(или другой тип, который расширяет Number, как требуется, если вы пометили StackArray как).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...