При каких обстоятельствах 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, в некоторых случаях, независимо от платформы, и описанный здесь случай является одним из них.