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 Comentarios

  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.

Dejar respuesta

Please enter your comment!
Please enter your name here