Seminář 8
Témata
- Generické typy
- Kolekce II
Generické typy
- Základy
- Objektové vs. primitivní typy, auto(un)boxing
Optional
- Generický typ pro reprezentaci možná nedostupné/neexistující hodnoty.
- Intuitivní ukázka generické třídy.
- Později na něj narazíme (u StreamAPI).
- Dokumentace
- Všeříkající citace: “Optional is primarily intended for use as a method return type where there is a clear need to represent ‘no result,’ and where using null is likely to cause errors. A variable whose type is Optional should never itself be null; it should always point to an Optional instance.”
- Jinými slovy pokud z metody může vypadnout
nulla pokud to nejspíš bude problém, tak můžeme místo typuTvracet typOptional<T>a tím si “vyžádat” kontrolu vrácené hodnoty ze strany volajícího. - Zajímavá je i poslední věta: není dobrý nápad dát do
Optional<T>proměnnénullhodnotu, byť technicky to možné je.
Comparable<T>
- Generické rozhraní reprezentující myšlenku “mé instance lze porovnávat s instancemi typu T”.
- Intuitivní ukázka generického rozhraní.
- Jediná metoda
int comapreTo(T o)- záporné číslo znamená
this < o - nula znamená
this = o - kladné číslo znamená
this > o - podívejte se do dokumentace, na programátora jsou kladeny i další požadavky.
- záporné číslo znamená
Další aspekty
- Omezení typu dosaditelného za parametr
- Wildcards (?)
- Generické metody, type erasure (žádný runtime overhead), omezení generiky, … pro zájemce základy v tutoriálu níže.
Zdroje a ukázky
- Přístupný tutoriál pokrývající vše, co bylo řečeno, a ještě něco navíc.
- Ukázky.
- ÚPRAVA: ukázky aktualizovány dle verze z hodiny.
Úkoly
- Kde to dává smysl, můžete pouze upravit své kódy z minulého úkolu.
- V úkolu nepoužívejte žádné kolekce ze standardní knihovny či jiných zdrojů.
- Implementujte generické rozhraní pro konečné množiny:
- pojmenujte jej
GenericSet<T>; - omezte situaci tak, aby
Tmuselo implementovatComparable<T>. Zamyslete se, čeho tím docílíte?
- pojmenujte jej
- Přidejte do rozhraní
GenericSet<T>metodymax()amin();- zvolte jim co nejvhodnější návratové typy
- Implementujte generickou množinu vnitřně reprezentovanou binárním vyhledávacím stromem:
- opět nemusíte řešit vyvažování;
- pojmenujte ji
GenericBSTSet<T>.
- Implementujte generickou množinu vnitřně reprezentovanou generickým seznamem:
- pojmenujte ji
GenericLLSet<T>).
- pojmenujte ji
- Ujistěte se, že Vaše
GenericBSTSet<T>aGenericLLSet<T>implementujíGenericSet<T>. - Upravte rozhraní
GenericSet<T>tak, aby se Vaše množiny daly navzájem porovnávat:- množiny porovnávejte podle kardinality;
- opravte vše, co se tím rozbije.
- Vše řádně zdokumentujte.
- Výsledek odevzdejte emailem s předmětem jj1-08 na tomas.urbanec@upol.cz do 28.11.2023, 14:59 CEST. Odevzdávejte pouze zdrojové kódy, nikoliv celé projekty vygenerované IDE.