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.