Home > Java > Collections vs Arrays w Javie

Collections vs Arrays w Javie

Bezpieczeństwo typów dla kolekcji i tablic w Javie.

public class A {
    public String getName() { return "A"; }
 
    public static void main(String[] args) {
        Set<B> bSet = new LinkedHashSet<B>();
        Set<A> aSet = bSet; // THIS WILL NOT COMPILE
        aSet.add(new C());
 
        B[] bTable = new B[2];
        A[] aTable = bTable;
        aTable[0] = new B();
        aTable[1] = new C(); //ArrayStoreException
    }
}
 
public class B extends A {
    @Override
    public String getName() { return "B"; }
}
 
public class C extends A {
    @Override
    public String getName() { return "C"; }
}

Załóżmy, że istnieje możliwość przypisania obiektu LinkedHashSet<B> do zmiennej referencyjnej Set<A>. Na nowej referencji można wywołać metodę aSet.add(new C()), czego skutkiem tego jest dodanie obiektu C (podtypu klasy A) do trzymanego na stercie obiektu LinkedHashSet<B>, co jest błędne. Należy jednocześnie pamiętać, że typy genetyczne są zapominane podczas kompilacji i w rzeczywistości w pamięci istnieje obiekt Map. W związku z powyższym przy próbie rzutowania obiektu LinkedHashSet<B> na Set<A> otrzymujemy błąd kompilacji.

Mając analogiczną sytuację dla tablic nie otrzymujemy żadnego powiadomienia o błędzie od kompilatora podczas rzutowania. Dopiero po uruchomieniu dostajemy wyjątek: ArrayStoreException. Jest on związany z próbą dodania do tablicy niezgodnego typu obiektu. Należy pamiętać, że w momencie tworzenia tablic zapamiętują one swój typ.

Z powyższego przykładu widać, że korzystanie z kolekcji jest bezpieczniejsze niż z tablic.

Kategorie:Java Tagi:, ,
  1. Brak komentarzy
  1. Brak jeszcze trackbacków