2007. szeptember 5., szerda

Puzzler reggelire

Amikor a java 1.5 jött, mindenki nagyon sejtette hogy milyen gebaszok következnek majd belőle. Lettek is, de azért sikerült megszoknunk a dolgot :-) Reggel bukkantam egy érdekes java puzzlerre, ami a java generics, az autoboxing és a számkifejezések kiértékelésének logikai ütközéséből jön. Persze logikus az egész.
Set s = new HashSet();
...
s.remove(i-1);
Az teljesen okés hogy az i-1 kifejezés int-re értékelődik ki, ezért Integer-re autoboxolódik, de ezt lehet tudni és ha azt is tudjuk hogy a s setben Short-okat tartunk, akkor ott nem kellene Integer-t keresni. De kipróbáltam eclipse-ben (3.3), nem mond rá semmit, az is teljesen logikus hogy miért nem. Azért mert a Set.remove metódus argumentuma Object, nem pedig a paraméterezett típus. Ha nem így lenne, lehetne errorozni és warningolni rá, de mégis így van, teljesen logikus okból: azért mert akkor törli ha az equals metódus azt mondja, az pedig fogadhat bármit, régi mese.
Azért vicces, szerintem. Valahogy az IDE-knek mégis warningolnia kellene ilyen eseteken, bár a metódusok paraméterezése helyes, talán warningolni kellene ha Set-ből nem a paraméterezett típusú objektumot próbálja a kód törölni. Csak néha feleslegesen warningolna és ezért mindenki figyelmen kívül hagyná :-(