Genérico De La Pila De La Matriz De

Tengo que implementar un genérico de pila, pero cuando intento compilar el proyecto tengo un error que no puedo entender. Aquí está el código:

Stack.java -> interfaz

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 -> la implementación de la interfaz

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];
    }

}

Y la clase principal:

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()+" ");
    }

}

Cuando intento compilar el proyecto en el que recibir el siguiente 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

Alguien me puede ayudar? Gracias!

3 Kommentare

  1. 3

    La borrado de T[] es Number[] debido a que el límite superior de T es Number. Por lo tanto su stack que realmente está declarada como una Number[] no Object[]. En el constructor está intentando asignar un Object[] a stack. Crear un Number[] lugar.

    stack=(T[])(new Number[size]);

    Como un aparte, usted probablemente querrá

    public class StackArray <T extends Number> implements Stack<T>

    No debería implementar la versión raw de la clase. La consecuencia es que usted necesita para actualizar otros métodos (por ejemplo, push(T) en lugar de push(Object)).

    • He hecho los cambios y ahora tengo el siguiente error: Exception in thread «main» java.lang.ClassCastException: java.lang.Objeto no puede ser echado a java.lang.Número en la pila.StackArray.pop(StackArray.java:40) en la pila.Principal.principal(Main.java:9) Java Resultado: 1 Línea de 40 T aux=(T)(new Object());
    • ¿Por qué intenta crear un nuevo objeto y, a continuación, vuelva a asignar la variable? Jus hacer T aux; – no es necesario inicializar (sin mencionar que es malo).
    • es derecho. No hay absolutamente ninguna razón que usted necesita para crear un objeto.
    • Knego: Gracias! Ese era el problema. He cambiado a simple T aux y trabajado. Problema resuelto!
    • alguna razón usted no desea utilizar Stack o ArrayDeque proporcionado por Java?
    • Esta es una tarea. Mi profesor me dijo para implementar la pila de esta manera… propósito educativo.

  2. 0

    Pruebe a cambiar la línea 5 de Main.java ser:

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

    (O de algún otro tipo que se extiende Número, como se requiere cuando te has marcado StackArray como ).

    • Lo he probado y no funciona.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea