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
>>>
>>
>
>

Odpovedet emailem