Sobes.tech
Middle

Čo sú generiká (Generics) v programovaní?

sobes.tech AI

Odpoveď od AI

Generiká sú mechanizmom v programovacích jazykoch, ktorý umožňuje vytvárať komponenty (triedy, rozhrania, metódy/funkcie), ktoré pracujú s rôznymi dátovými typmi, pričom neznižujú typovú bezpečnosť a nevyžadujú casting.

Hlavné ciele používania generík:

  • Zvýšenie typovej bezpečnosti: Kompilátor kontroluje typy počas kompilácie, odhaľuje chyby pred spustením programu.
  • Zlepšenie čitateľnosti kódu: Je jasné, s ktorými typmi dát komponent pracuje.
  • Opakované použitie kódu: Môže sa vytvoriť jeden komponent, ktorý pracuje s rôznymi typmi, namiesto písania viacerých verzií.
  • Zníženie castingov: Vyhýba sa potrebe explicitného castingovania, čo robí kód čistejším a menej náchylným na chyby ClassCastException (v jazykoch, kde je to relevantné, napr. Java).

Príklady použitia generík:

  • Kolekcie: Zoznamy (List), množiny (Set), mapy (Map) môžu obsahovať prvky určitého typu, čo zaručuje, že do kolekcie nevstúpia prvky iného typu.
  • Metódy/funkcie: Metóda môže pracovať s parametrami alebo vracať hodnotu univerzálneho typu.
  • Triedy/rozhrania: Môžu sa vytvárať univerzálne dátové štruktúry alebo vzory správania.

Príklad v Jave:

// Generická trieda 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žitie
Pair<String, Integer> pair = new Pair<>("Hello", 123);
String str = pair.getFirst(); // Nie je potrebné casting
int num = pair.getSecond();   // Nie je potrebné casting

// Nesprávne párovanie
Pair<String, Integer> wrongPair = new Pair<>(123, "Hello"); // Chyba kompilátora: nesúlad typov

Príklad v C#:

// Generická trieda 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žitie
var pair = new Pair<string, int>("Hello", 123);
string str = pair.First; // Nie je potrebné casting
int num = pair.Second;   // Nie je potrebné casting

// Nesprávne párovanie
var wrongPair = new Pair<string, int>(123, "Hello"); // Chyba kompilátora

Príklad v TypeScript:

// Generická funkcia na získanie prvého prvku poľa
function getFirstElement<T>(arr: T[]): T | undefined {
    if (arr.length > 0) {
        return arr[0];
    }
    return undefined;
}

// Použitie
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

Takže, generiká predstavujú mocný nástroj na tvorbu flexibilného, typovo bezpečného a opakovane použiteľného kódu.