Sobes.tech
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);