Skip to end of metadata
Go to start of metadata

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.

      
      
Page viewed times

4 Comments

  1. 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:

    <T> T newInstance(Class<T>) {
      return new T();
    }
  2. 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

    1. Auth Gábor AUTHOR

      A Java 5.0 környékén jött be, ha jól rémlik. Egy rövidített for ciklus, végigjárja a listákat, ennyi a dolga.
      1. 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:

        for(int i = 0; ...) {
            for(int k = 0; ...) {
               for(int x = 0; ...)
                  for(i = 0; ...)
        //        ^ itt ugye nem jelzett hibát hogy már létezik ilyen nevű
        //          változó mert figyelmetlenségből lemaradt az int :-(
            }
        }

        --
        sirkalmi

#trackbackRdf ($trackbackUtils.getContentIdentifier($page) $page.title $trackbackUtils.getPingUrl($page))