Sobes.tech
Middle

Co jsou generika (Generics) v programování?

sobes.tech AI

Odpověď od AI

Obecné (Generics) jsou mechanismem v programovacích jazycích, který umožňuje vytvářet komponenty (třídy, rozhraní, metody/funkce), které pracují s různými datovými typy, aniž by ztratily typovou bezpečnost a aniž by bylo nutné provádět přetypování (casting).

Hlavní cíle používání generik:

  • Zvýšení typové bezpečnosti: Kompilátor kontroluje typy v době kompilace, odhaluje chyby před spuštěním programu.
  • Zlepšení čitelnosti kódu: Je jasné, s jakými datovými typy komponent pracuje.
  • Opakované použití kódu: Lze vytvořit jeden komponent, který pracuje s různými typy, místo psaní několika verzí.
  • Snížení přetypování: Odstraňuje potřebu explicitního přetypování, což činí kód čistším a méně náchylným k chybám ClassCastException (v jazycích, kde je to relevantní, například Java).

Příklady použití generik:

  • Kolekce: Seznamy (List), množiny (Set), mapy (Map) mohou uchovávat prvky určitého typu, což zaručuje, že do kolekce nevstoupí prvky jiného typu.
  • Metody/funkce: Metoda může pracovat s parametry nebo vracet hodnotu univerzálního typu.
  • Třídy/rozhraní: Lze vytvářet univerzální datové struktury nebo vzory chování.

Příklad v jazyce Java:

// Obecná třída páru
public class Pair<T, U> {
    private T first;
    private U second;

    public Pair(T first, U second) {
        this.first = first;
        this.second = second;
    }

    public T getFirst() {
        return first;
    }

    public U getSecond() {
        return second;
    }
}

// Použití
Pair<String, Integer> pair = new Pair<>("Hello", 123);
String str = pair.getFirst(); // Není potřeba přetypování
int num = pair.getSecond();   // Není potřeba přetypování

// Nesprávné přiřazení
Pair<String, Integer> wrongPair = new Pair<>(123, "Hello"); // Chyba kompilace: nesoulad typů

Příklad v jazyce C#:

// Obecná třída Pair
public class Pair<T, U>
{
    public T First { get; set; }
    public U Second { get; set; }

    public Pair(T first, U second)
    {
        First = first;
        Second = second;
    }
}

// Použití
var pair = new Pair<string, int>("Hello", 123);
string str = pair.First; // Není potřeba přetypování
int num = pair.Second;   // Není potřeba přetypování

// Nesprávné přiřazení
var wrongPair = new Pair<string, int>(123, "Hello"); // Chyba kompilace

Příklad v TypeScriptu:

// Obecná funkce pro získání prvního prvku pole
function getFirstElement<T>(arr: T[]): T | undefined {
    if (arr.length > 0) {
        return arr[0];
    }
    return undefined;
}

// Použití
let numbers: number[] = [1, 2, 3];
let firstNumber = getFirstElement(numbers); // firstNumber má typ number

let words: string[] = ["a", "b", "c"];
let firstWord = getFirstElement(words);   // firstWord má typ string

// let mixedArray: (number | string)[] = [1, "a", 2];
// let firstMixed = getFirstElement(mixedArray); // firstMixed má typ number | string

Tímto jsou generika mocným nástrojem pro tvorbu flexibilního, typově bezpečného a znovu použitelných kódu.