Wytłumaczenie wildcardów

0

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?

0

Poczytaj sobie o konwencji PECS (Producer Extends Consumer Super), np. https://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super

0

Pytasz o Jave, wiec moja odpowiedź może zaskoczyć: polecam Kotlin in Action rozdział 9 - Generics. Tam jest to raczej bardziej skomplikowane niż w Javie, ale dzięki temu prędzej zrozumiesz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1