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
null
a pokud to nejspíš bude problém, tak můžeme místo typuT
vracet 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énull
hodnotu, 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
T
muselo 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.