Caugth ClassCastException в моем приложении Java

Реализация очереди использует массив, но я получаю исключение.

У меня есть интерфейс с именем Queue с универсальным ArrayQueue в качестве реализованного класса интерфейса Queue ArrayQueueTest в качестве основного класса для тестирования кода.

public interface Queue<E>
{
    public void enqueue(E e);//insert an element in a queue
    public E dequeue();/delete an element in queue and return that element
    public int size();//give the number of elements in an queue
    public E first();//give the first element of queue if any but not removing it
    public boolean isEmpty();//indicate whether queue is empty or not
}    

public class ArrayQueue<E> implements Queue<E>
{   
    E [] data;   //array based implementation queue
    int front;   //indicating the first element of queue
    int size;   //size of queue indicator
    ArrayQueue(int x)    //initialization of queue
{
    data=(E [])(new Object[x]);     
}
public boolean isEmpty()
{
    return size==0;
}
public int size()
{
    return size;
}
public E first()
{
    return data[front];
}
public E dequeue()
{   
    if(isEmpty())   
    {  
        System.out.println("queue is empty");
        return null;
    }
    E ans=data[front];
    data[front]=null;
    front=(front+1)%data.length;
    size--;        
    return ans;
}
public void enqueue(E e)
{
    if(size==data.length)
    {
        System.out.println("size is full");
        return;
    }
    data[(front+size)%data.length]=e;
    size++;
}
}     

public class ArrayQueueTest 
{

    public static void main(String[] args)
    {
        System.out.println("welcome");
        ArrayQueue <Integer>aq=new ArrayQueue<Integer>(5);
        aq.enqueue(new Integer(5));  
        aq.enqueue(new Integer(6));
        aq.enqueue(new Integer(0)); 
        aq.enqueue(new Integer(8));
        System.out.println(aq.size());

        for(int i=0;i<aq.size();i++)    //loop to print the data of queue
        {  
            // Object ob=aq.data[i];    //why i will get an exception if i did not make a comment to this line
            System.out.println(aq.data[i]); /*why i am getting a ClassCastException getting at this line */
        }
    }
}

1 ответ

Вы игнорируете предупреждения времени компиляции. Это никогда не хороший знак.

В основном, предупреждение говорит вам, что вы не можете сделать бросок, используя E[], Это приведение в основном удаляется во время процесса компиляции с предупреждением.

data теперь в основном становится Object[] массив во время выполнения, и используется в таком случае, компилятор добавляет приведение типа (E) в местах, где требуется приведение, таких как Integer i = (Integer)aq.dequeue();, Java также делает это при доступе к массиву, например ((Integer[])aq.data)[i] Это действительно тот эффект, что генерики удаляются во время компиляции.

Хотя Java помогает вам правильно, он также показывает, что Object[] это не Integer[], Если бы java не удалял обобщенные элементы во время компиляции, это привело бы к ошибке в той строке, где сейчас находится предупреждение.

Вы должны решить свой data проблема, предоставляя 2 метода, такие как Object[] Collections.toArray() а также E[] toArray(E[])

Другие вопросы по тегам