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[])