2012-07-13 3 views
0
public class Main { 
    public static void main(String[] args) { 
     List<Object[]> list = getIt(); 

//  unsuccessful iteration, throws ClassCastException 
     for (Object id : list) { 
      System.out.println(id); 
     } 

//  successful iteration 
     Iterator iterator = list.iterator(); 
     while (iterator.hasNext()) { 
      System.out.println(iterator.next()); 
     } 
    } 

    private static List<Object[]> getIt() { 
     List list = new ArrayList(); 
     list.add(1L); 
     return list; 
    } 
} 

Понятно, по какой-либо приблизительной оценке, что происходит (итератор, сгенерированный компилятором, содержит явное приведение), но хотел бы получить хорошие ответы, спасибо.Какова конкретная причина исключения класса в следующем коде?

+0

Это просто особенность языка. Что еще вы ищете? – Lion

+2

Он компилируется и выполняется без проблем на Eclipse. Покажите нам стек и версию Java, которую вы используете. – npe

+0

У меня нет исключений, выполняющих ваш код. – Keppil

ответ

0

Ну, я думаю, это потому, что под обложкой Java компилятор генерирует л так:

Iterator iterator = list.iterator(); 
     while (iterator.hasNext()) { 
      System.out.println((Object[])iterator.next()); 
     } 

и явное приведение дает ошибку. Как правило, это проблема смешивания дженериков с необработанными типами, но, как я уже сказал, я не говорю здесь о лучших практиках.

1

Когда я запускаю это с помощью Java 7, я не получаю исключение ClassCastException и не ожидаю, что это будет как объект, отлитый как Object в main();