Cześć, uczę się już od jakiegoś czasu ale nie bardzo rozumiem przeznaczenie dzikich kart.
Z tego co zrozumiałem dzikich kart używamy gdy chcemy bezpiecznie typować do klasy bez uzyskania runtime exception spowodowanego przez Raw Type - czyli np gdybyśmy do listy typu List<Object> przypisali listę stringów a potem iterowali po liście. Ale jak się mają do tego dzikie karty i w jakim kontekście się to stostuje?
Mamy np 3 klasy.
Pracownik - Bazowa
Manager - dziedziczy po pracowniku.
Dyrektor - dziedziczy po pracowniku.
Tak więc gdy mamy listę z pracownikami możemy do niej dodawać zarówno managerów jak i dyrektorów. Natomiast gdy w jakieś funckji przyjmujemy za parametr List<Pracownik> list, i chcemy zamiast listy pracowników użyć listy managerów musisz zrobić List<? extends Pracownik> i tutaj o ile dobrze rozumiem dajemy znać, że parametr listy może rozszerzać klasę bazową lub być klasą bazową.
Przy takim wyrażeniu: <T extends A & B> - doszedłem do wniosku, że klasa T musi jednocześnie implementować interfejs/ rozszerzać klasę abstrakcyjną A i B.
Natomiast nie rozumiem kiedy stosujemy <? super Pracownik>, nie mogę sobie wyobrazić jakiegoś praktycznego zastosowania.
A teraz hardcorowe przypadki: <T extends Object & Comparable<? super T>> albo T function(Collection<? extends T> coll) co się tutaj dzieje? Wytłumaczy ktoś łopatologicznie?