Sobes.tech
Middle

Jaké možnosti poskytují Generics?

sobes.tech AI

Odpověď od AI

Generika (obecné typy) nabízejí následující výhody:

  • Opakované použití kódu: Vytváření tříd, rozhraní a metod, které mohou pracovat s objekty různých typů bez ztráty typové bezpečnosti.
  • Typová bezpečnost při kompilaci: Kompilátor může ověřit správnost použití typů a zabránit chybám za běhu souvisejícím s převody typů.
  • Zlepšení čitelnosti kódu: Explicitní uvádění typů v signaturách metod a deklaracích tříd činí kód srozumitelnějším.
  • Zvýšení výkonu (v některých jazycích): V jazycích, kde jsou generika implementována pomocí odstranění typů (například Java), je to dosaženo eliminací potřeby převodů typů za běhu. V jazycích, kde jsou implementována pomocí monomorfizace (například šablony C++), to může vést ke zvětšení kódu, ale potenciálně k rychlejšímu běhu díky odstranění dynamických volání.
  • Kompatibilita s kolekcemi: Umožňuje snadnější práci s kolekcemi tím, že specifikuje typ prvků, které kolekce obsahuje.

Příklad v Javě:

// Bez generik
List list = new ArrayList();
list.add("string");
// Při získávání je potřeba převod typu, možný ClassCastException
String s = (String) list.get(0);

// S generiky
List<String> stringList = new ArrayList<>();
stringList.add("string");
// Převod typu není potřeba, typová bezpečnost je garantována
String s2 = stringList.get(0);
// Chyba při pokusu přidat neslučitelný typ
// stringList.add(123);

Příklad v C#:

// Bez generik
ArrayList list = new ArrayList();
list.Add("string");
// Při získávání je potřeba převod typu
string s = (string) list[0];

// S generiky
List<string> stringList = new List<string>();
stringList.Add("string");
// Převod typu není potřeba
string s2 = stringList[0];
// Chyba při kompilaci
// stringList.Add(123);