Mind a Java 5.0 mind a .NET 2.0 támogatja a generikus szűkítést, bár eltérő módon. A Java a "code sharing" technikát használja, vagyis az alaptípus kerül használatra és a fordító oldja meg a típusvédelmet. .NET esetén a típus szűkítése önálló típusként kerül a VM elé. A code sharing egy érdekes mellékhatást hoz létre, nézzük az alábbi kód futását:
List<Integer> list1 = new ArrayList<Integer>(); list1.add(1); list1.add(2); List list2 = list1; list2.add("A"); for (int i : list1) { System.out.println(i); }
A lényeg ott van, hogy list2 már nem tartalmaz szűkítést a típusra vonatkozóan, s egy szimpla referencia lesz csak, amelyhez azonban hozzá tudunk adni egy String típusú értéket, amelyre aztán a list1 példányon alapuló ciklus jól kiakad:
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
A .NET futásidejű specializációja jobb teljesítményt is jelent, mivel nincs szükség classcast műveletre.
4 Comments
Karnok Dávid
Igen, ez a probléma minden generics-es könyvben benne van, mint figyelmeztetés. A compiler a List list2 = list1 sornál Unchecked warningot ad, mert nem generikus változóhoz rendeled hozzá a generikust. Erre figyelni kell. A Java azt garantálja, ha nincs Unchecked warning a kódodban, akkor nem kapsz a generikus objektumok használatakor ClassCastException-t.
A .NET generics kicsit máshogy működik, ott a fordító eltárolja a generikus típusinformációkat, ezért működik ott az alábbi kód:
Mariák Kálmán
Számomra ez volt a legérdekesebb: for (int i : list1) Mi ez valami új szintaktika a Listák végigjárásához?
--
sirkalmi
Auth Gábor AUTHOR
Mariák Kálmán
Nagyon hasznos dolog ezentúl használni fogom. Bár az iterátor használata talán még kézenfekvőbb mert ott megspórolom az "i" változó bevezetését is. Múltkor frankón elment fél napom mire rájöttem a hibára ami egy 5 egymásba ágyazott for ciklusban volt. Ott követtem el a hibát hogy az egyik for ciklusban lemaradt a típus így csak értékadás volt de azt a változót már használtam kijjebb de szintaktikailag rendben volt ugye hogy lemaradt az int az i elől. Valahogy így:
--
sirkalmi