Dlaczego poniższy kod nie kompiluje się?
List<Object> lo = new ArrayList<String>();
Czy dla typów generycznych nie działa polimorfizm?
Dlaczego poniższy kod nie kompiluje się?
List<Object> lo = new ArrayList<String>();
Czy dla typów generycznych nie działa polimorfizm?
Zobaczmy, jakie byłyby konsekwencje, gdyby kod był prawidłowy.
Powyższy kod można byłoby zapisać w równoważny sposób:
List<String> ls = new ArrayList<String>(); // wiersz 1 List<Object> lo = ls; // wiersz 2
Wiersz 1 nie budzi zastrzeżeń. Przyjmijmy, że wiersz 2 też jest prawidłowy. Wówczas można byłoby napisać:
lo.add(new Object()); // wiersz 3 String s = ls.get(0); // wiersz 4
Kompilator nie zaprotestuje przy wierszu 3. Problem powstanie w wierszu 4 - pod indeksem 0 kryje się obiekt typu Object i próbujemy go wskazać poprzez referencję typu String.
Z tego powodu błąd kompilacji wystąpi w wierszu 2, a tym samym także w wierszu w pytaniu... Typ List<Object> nie jest nadtypem dla List<String>.
Nie oznacza to, że w przypadku typów generycznych wykluczony jest polimorfizm. Sposobem na jego wprowadzenie jest użycie typów z dzikimi kartami.