To se mi nezdá. Tento bytecode nemůže vyhodit ClassCastException, IMHO ten poůvodní bytecode vypadal jinak.
Kamil Podlešák 2010/8/10 "Zdeněk Troníček" <[email protected]>: > V byte kodu pretypovani neni. Metoda > > protected static void process(List<Employee> list) { > for (Object o : list) { > System.out.println(o); > } > } > > se prelozi takto: > > protected static void process(java.util.List); > Code: > 0: aload_0 > 1: invokeinterface #2, 1; //InterfaceMethod > java/util/List.iterator:()Ljava/util/Iterator; > 6: astore_1 > 7: aload_1 > 8: invokeinterface #3, 1; //InterfaceMethod > java/util/Iterator.hasNext:()Z > 13: ifeq 33 > 16: aload_1 > 17: invokeinterface #4, 1; //InterfaceMethod > java/util/Iterator.next:()Ljava/lang/Object; > 22: astore_2 > 23: getstatic #5; //Field > java/lang/System.out:Ljava/io/PrintStream; > 26: aload_2 > 27: invokevirtual #6; //Method > java/io/PrintStream.println:(Ljava/lang/Object;)V > 30: goto 7 > 33: return > > [WindowsXP, java version "1.6.0_17" > Java(TM) SE Runtime Environment (build 1.6.0_17-b04) > Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)] > > Jinak puvodni otazka byla "jak to ma spravne fungovat?". Na to jsem > odpovidal. Nicmene otazka "proc to na linuxu vyhazuje vyjimku?" je take > zajimava :). > > Z. > -- > Zdenek Tronicek > FIT CTU in Prague > > > Kamil Podlesak napsal(a): >> Pokud se nepletu, tak na windows je defaultní client VM, zatímco jinde >> server VM. Liší se v tom kdy a jak provádějí kompilaci a optimalizace >> JITem. >> >> Takže teoreticky je možné, že -client provede ihned optimalizaci a >> vyhodí přetypování na Employee, zatímco -server se pokusí alespoň >> jednou provést smyčku bez optimalizace. >> >> Hodně záleží na tom, jak vypadá bytecode. Samotný kód v Javě tady moc >> nepomůže, protože z něj nevidíme zda tam to přetypování opravdu je >> nebo není (ale nejspíš je, když se provádí). >> >> >> Kamil Podlešák >> >> 2010/8/10 Ondra Medek <[email protected]>: >>> Sorry, napsal jsem to spatne. Toto: >>> >>> for (Object object : list) { >>> @SuppressWarnings("unchecked") >>> Map<String, Object> map = (Map<String, Object>)object; >>> // ... >>> } >>> >>> projde na Win, ale na Linuxu ne. Toto: >>> >>> for (Object object : (List<?>)list) { ... } >>> >>> projde vsude. >>> >>> Take mne zarazilo, proc to na tom linuxu neprojde, kdyz se typove >>> parametry odmazavaji. Jo to pripadne JRE bug? >>> >>> >>> 2010/8/10 "Zdeněk Troníček" <[email protected]>: >>>> Ahoj, >>>> >>>> vzdyt tam mas pretypovani na List<?>. Tak si nejsem jisty, jak jsi to >>>> myslel. Jinak cyklus >>>> >>>> for (Employee e : list) { >>>> ... >>>> } >>>> >>>> bude pred prekladem (ve fazi desuggaring) nahrazen cyklem >>>> >>>> for (Iterator<Employee> i = list.iterator(); i.hasNext(); ) { >>>> Employee e = i.next(); >>>> ... >>>> } >>>> >>>> Tedy cyklus >>>> >>>> for (Object o : list) { >>>> ... >>>> } >>>> >>>> kde list je typu List<Employee> bude nahrazen cyklem >>>> >>>> for (Iterator<Employee> i = list.iterator(); i.hasNext(); ) { >>>> Object o = i.next(); >>>> ... >>>> } >>>> >>>> Po odmazani typovych parametru: >>>> >>>> for (Iterator i = list.iterator(); i.hasNext(); ) { >>>> Object o = i.next(); >>>> ... >>>> } >>>> >>>> Takze podle meho nazoru by to volani melo projit. >>>> >>>> Z. >>>> -- >>>> Zdenek Tronicek >>>> FIT CTU in Prague >>>> >>>> >>>> Ondra Medek napsal(a): >>>>> Ahoj, >>>>> >>>>> mam metodu >>>>> >>>>> protected void process(List<Employee> list) { >>>>> // ... >>>>> >>>>> for (Object object : (List<?>)list) { >>>>> @SuppressWarnings("unchecked") >>>>> Map<String, Object> map = (Map<String, Object>)object; >>>>> // ... >>>>> } >>>>> } >>>>> >>>>> ovsem za parametr list je misto List<Employee> pouzivan List<HashMap>. >>>>> Ano, je to prasarna, ale to je ted vedlejsi. >>>>> >>>>> na stroji WinXP s >>>>> java version "1.6.0_18" >>>>> Java(TM) SE Runtime Environment (build 1.6.0_18-b07) >>>>> Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing) >>>>> >>>>> to projde, kdezto na Linuxu se stejnou Javou: >>>>> java version "1.6.0_18" >>>>> Java(TM) SE Runtime Environment (build 1.6.0_18-b07) >>>>> Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode) >>>>> >>>>> to vyhodi >>>>> >>>>> java.lang.ClassCastException: java.util.HashMap cannot be cast to >>>>> cz.prins.tiger.db.Employee >>>>> >>>>> Jen by mne zajimalo, ktere chovani je dobre? BTW. kdyz ten list >>>>> pretypuju na List<?>, tak to dopadne dobre vsude. >>>>> >>>>> >>>>> -- >>>>> Ondra Medek >>>>> >>>> >>>> >>> >>> >>> >>> -- >>> Ondra Medek >>> >> > >
