Middle
Aké možnosti poskytujú Generics?
sobes.tech AI
Odpoveď od AI
Generik (všeobecné typy) poskytujú nasledujúce výhody:
- Opakovné použitie kódu: Vytváranie tried, rozhraní a metód, ktoré môžu pracovať s objektmi rôznych typov bez straty typovej bezpečnosti.
- Typová bezpečnosť počas kompilácie: Kompilátor môže overiť správnosť použitia typov a zabrániť chybám počas behu súvisiacim s konverziami typov.
- Zlepšenie čitateľnosti kódu: Explicitné uvádzanie typov v podpisoch metód a deklaráciách tried robí kód zrozumiteľnejším.
- Zvýšenie výkonu (v niektorých jazykoch): V jazykoch, kde sú generiká implementované pomocou odstránenia typov (napríklad Java), sa to dosahuje elimináciou potreby konverzií typov počas behu. V jazykoch, kde sú implementované pomocou monomorfizmu (napríklad šablóny C++), to môže viesť k zväčšeniu veľkosti kódu, ale potenciálne k rýchlejšiemu behu elimináciou dynamických volaní.
- Kompatibilita s kolekciami: Uľahčuje prácu s kolekciami tým, že umožňuje špecifikovať typ prvkov, ktoré obsahujú.
Príklad v Jave:
// Bez generík
List list = new ArrayList();
list.add("string");
// Pri získavaní je potrebný konverzný typ, možný ClassCastException
String s = (String) list.get(0);
// S generikami
List<String> stringList = new ArrayList<>();
stringList.add("string");
// Nie je potrebný konverzný typ, typová bezpečnosť je garantovaná
String s2 = stringList.get(0);
// Chyba pri pokuse pridať nesúladný typ
// stringList.add(123);
Príklad v C#:
// Bez generík
ArrayList list = new ArrayList();
list.Add("string");
// Pri získavaní je potrebný konverzný typ
string s = (string) list[0];
// S generikami
List<string> stringList = new List<string>();
stringList.Add("string");
// Nie je potrebný konverzný typ
string s2 = stringList[0];
// Chyba pri kompilácii
// stringList.Add(123);