# 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`