ClassCastException в цикле foreach Java

При каких обстоятельствах ClassCastException может возникнуть в приведенном ниже коде:

import java.util.Arrays;
import java.util.List;

public class Generics {

    static List getObjects() {
        return Arrays.asList(1, 2, 3);
    }

    public static void main(String[] args) {
        List list = getObjects();
        for (Object o : list) { // ClassCastException?
            System.out.println(o);
        }
    }
}

У нас был аналогичный случай в производственной среде (я знаю, что это плохая практика) и заказчик предоставил журнал с ClassCastException в строке с комментарием, но я не могу его воспроизвести. Есть мысли?

Я знаю, что JVM создает итератор в фоновом режиме при использовании foreach, но может ли он создать необработанный итератор в некоторых случаях и параметризованный в других случаях?

Обновление : Я также взглянул на сгенерированный байт-код и в Windows, используя JDK 1.6.0_21-b07, не было сделано контрольное сообщение . Интересно :)

Вот основной способ:

public static void main(java.lang.String[]);
  Code:
   0:   invokestatic    #34; //Method getObjects:()Ljava/util/List;
   3:   astore_1
   4:   aload_1
   5:   invokeinterface #36,  1; //InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
   10:  astore_3
   11:  goto    28
   14:  aload_3
   15:  invokeinterface #42,  1; //InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
   20:  astore_2
   21:  getstatic   #48; //Field java/lang/System.out:Ljava/io/PrintStream;
   24:  aload_2
   25:  invokevirtual   #54; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V
   28:  aload_3
   29:  invokeinterface #60,  1; //InterfaceMethod java/util/Iterator.hasNext:()Z
   34:  ifne    14
   37:  return

Всем спасибо за ответы!

Обновление 2 : Меня ввела в заблуждение среда Eclipse IDE, которая использует свой собственный компилятор , так что на самом деле байт-код над ним был сгенерирован с помощью компилятора Eclipse . Посмотрите здесь , как вручную скомпилировать код с помощью Eclipse. В заключение, компилятор Eclipse генерирует байтовый код, отличный от компилятора Sun, в некоторых случаях, независимо от платформы, и описанный здесь случай является одним из них.

6
задан 10 October 2010 в 20:42
поделиться