2013-11-14 29 views
0

Я получаю ClassCastException в коде наблюдения:java.lang.ClassCastException во время выполнения

Destination[] destinations; 
ArrayList<Destination> destinationsList = new ArrayList<Destination>(); 

// ..... 

destinations = (Destination[]) destinationsList.toArray(); 

Мой класс Destination выглядит следующим образом:

public class Destination { 

    private String code; 

    Destination (String code) { 

     this.code = code; 

    } 

    public String getCode() { 

     return code; 

    } 
} 

Синтаксический Я не получаю никаких ошибок , это происходит только во время выполнения. Это запутанно, хотя, потому что не все классы являются по существу производными класса Object? И если да, то почему эта ошибка преобразования конверсии даже возникает?

+3

Используйте перегруженную версию 'toArray'. –

+1

«не все классы, по существу производные класса Object?» Это означает, что все может быть отправлено на «Object», а не на то, что «Object» можно отбросить ко всему. – Darkhogg

+0

@ Darkhogg - Ах, спасибо, я вижу – Tiwaz89

ответ

2

потому что ToArray возвращает массив объектов не ваш Destination[]

заменить его с этим

destinations[] = destinationsList.toArray(new Destination[destinationList.size()]); 

это будет заполнить новый объект назначения массива и вернуть заселена массив.

Edit:

Чтобы ответить на ваш вопрос в комментариях в @ ZouZou отвечает.

Вам нужен new Destination[], так как Destination[] может быть отправлен Object[], но в ином случае невозможно.

уточнить вещи,

String s = "hello"; 
Object o = s; 
s = (String) o; //works 

//but 

String s = "hello"; 
Object o = s; 
o = new Object; 
s = (String) o; //gives you a ClassCastException because an Object 
       //cannot be referred by a string 

Поскольку строка имеет все свойства, определенные в классе Object через наследование, а объект не обладает свойствами String объекта. Вот почему законно бросать дерево наследования, а downcasting - нет.

+0

Итак, кастинг, как я это сделал. '(Destination [])' никогда не будет работать почему? – Tiwaz89

+2

@Relborg см. Мое редактирование –

+0

Ах! Лампочка! Это то, что я не понял и не принял во внимание. Дерево наследования, большое вам спасибо, что имеет смысл сейчас. – Tiwaz89

6

toArray() возвращает Object[]. Что вам нужно, это toArray(T[] a) из-за стирания типа, общая коллекция не может создать типизированный массив.

Используя перегруженный метод, вы можете помочь ему создать типизированный массив объектов Destination.

Использование

destinations = destinationsList.toArray(new Destination[destinationList.size()]);

+0

Спасибо, что сработало отлично! Но все же .. Я не понимаю, зачем вам это нужно, toArray() возвращает Object [], тогда вы просто бросаете этот Object [] в Destination [] .. Что это за T [] все о? – Tiwaz89

+0

Еще одна вещь: Поскольку toArray() возвращает объект [], и я хочу, чтобы он был сохранен в переменной Destination [], разве это не то, что тип casting FOR? Я понимаю, что вы говорите, но почему он не работал так, как я это делал? Есть ли у меня неправильное понимание типа литья тогда вообще? – Tiwaz89

+1

@Relborg Вы не можете использовать массив 'Object []', возвращаемый 'toArray()', в массив 'Destination []' b'coz, фактический массив, создаваемый 'toArray()', является 'Object [] '. –

0

Он не реализован на уровне языка из-за того, как генерические элементы помещаются на этом языке. Кроме того, не попробовать что-то вроде этого:

// Destination[] destinations; 
    ArrayList<Destination> destinationsList = new ArrayList<Destination>(); 
    //add some destinations 
    destinationsList.add(new Destination("1")); 
    destinationsList.add(new Destination("2")); 
    // ..... 
    Object[] destinations = destinationsList.toArray(); 
    destinations[1] = "2"; //simulate switching of one object in the converted array with object that is of other type then Destination 
    for (Object object : destinations) { 
     //we want to do something with Destionations 
     Destination destination = (Destination) object; 
     System.out.println(destination.getCode()); //exception thrown when second memeber of the array is processed 
    } 

Используйте это:

destinations = destinationsList.toArray(new Destination[0]); //yes use 0 
Смежные вопросы