# 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` - 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` - pokud potřebujeme použít nějakou metodu tohoto rozhraní ve třídě, můžeme `Object` přetypovat na `T`