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