FAV-ZCU/KIV PPA2/09. Třídy s typovým parametrem.md

34 lines
1.3 KiB
Markdown

# Třídy s typovým parametrem
- často potřeba kolekce pro různé datové typy
- není vhodné vytvářet samostatné kolekce (třídy) pro různé datové typy
### Řešení pomocí Object
- všechny třídy dědí z Object
- vkládání není problém
- **problém**
- při vybrání prvku je potřeba **jej přetypovat**
- případná chyba se objeví až za běhu programu
**Obalovací třída**
- anglicky wrapper
- poskytuje metody, které provádějí **přetypování na správnou třídu**
- skrývá vnitřní implementaci s `Object`
- **problém**
- je potřeba ji vytvořit pro každý datový typ
**Generická třída**
- **"správné" řešení**
- třída s typovým parametrem `class MyStack<T>`
- datový typ `Object` poté nahradíme typem `T`
- bohužel nefunguje všude
- typ `T` pouze přebíráme a vracíme
- vnitřně používáme `Object`, který poté přetypujeme
- typovým parametrem nemůže být primitivní datový typ
- využijeme obalovací třídu (`Integer`, `Double`, ...)
- přetypování (boxing a unboxing) probíhá automaticky, je ale dobré o něm vědět
- někdy je potřeba, aby typový parametr něco uměl
- je možné použít rozhraní
- `class MyStack<T extends IProcessable>`
- pokud potřebujeme použít nějakou metodu tohoto rozhraní ve třídě, můžeme `Object` přetypovat na `T`