2013-09-11 2 views
1

Я пытаюсь сделать представление Deque связанным списком, каждый узел связанного списка определяется экземпляром внутреннего класса Node, m получение этого:Получение ClassCastException при попытке создать массив внутреннего типа класса

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [LRandomizedQueue$Node; 

Я знаю, как это сделать. Это то, что у меня было:

private class Node { 
     Item item; 
     Node next; 
     Node prev; 
    } 

    @SuppressWarnings("unchecked") 
    private Node[] nd = (Node[]) new Object[100]; 

Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно, и помогите мне понять это? Большое спасибо за ваше время.

Редактировать: Кажется, у меня были проблемы с созданием общего массива против массива внутреннего класса. Большое спасибо за ответы.

+0

Вы создаете 'Object []' и пытаетесь передать его в 'Node []'. Ожидаете ли вы, что Node node = (Node) новый Object() 'будет работать? – yshavit

+0

Всегда неплохая идея не иметь @SuppressWarnings («unchecked») –

ответ

2

Вы создаете массив объектов, а затем пытаетесь передать их в массив узлов; вам нужно создать массив узлов

попробовать

private Node[] nd = new Node[100]; 
1
private Node[] nd = (Node[]) new Object[100]; 

Это Должен бросает ClassCastException. Невозможно передать объект массива объекту Node.

Создать как -

Node[] nd = new Node[100]; 
+0

Стоит отметить, что это возможно наоборот, в то время как это (возможно) не должно –

1
private Node[] nd = (Node[]) new Object[100]; 

Почему вы это делаете?

Вы явно бросаете неправильные объекты в неправильные ссылочные типы.

Объект имеет тип Object[], и вы отбрасываете его на Node[], который никогда не будет работать.

Сделайте это вместо этого.

Node[] nd = new Node[size]; 
0

Вы в основном нужно: private Node[] nd = new Node[100];

Поскольку массивы являются сами объекты, так как new Object[100] возвращает объект класса массива вы не можете бросить его в какой-то другой объект класса, который здесь является Node.

0

Вы создаете массив объектов и пытаетесь передать его в массив Node.этот вид литья не допускается, так как объект не является Node

вы можете сделать

Node[] nd = new Node[100]; 

если вам нужен массив Node или

Object[] nd = new Object[100]; 

, если вам нужно просто массив объектов

для будущего, вы должны знать, что обычно, когда вы получаете ClassCastException, это означает, что вы пытались отличить класс от другого класс, когда случай недействителен, и должен попытаться понять иерархию объектов.

Смежные вопросы