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