Sobes.tech
Middle

Kas yra generikai (Generics) programavime?

sobes.tech AI

Atsakymas iš AI

Bendrieji (Generics) yra mechanizmas programavimo kalbose, leidžiantis kurti komponentus (klases, sąsajas, metodus/funkcijas), kurie veikia su įvairiais duomenų tipais, neprarandant tipų saugumo ir nereikalaujant tipų konvertavimo (casting).

Pagrindiniai generics naudojimo tikslai:

  • Tipų saugumo didinimas: Kompiliatorius tikrina tipus kompiliacijos metu, aptinka klaidas prieš programos vykdymą.
  • Kodo skaitomumo gerinimas: Aišku matyti, su kokiais duomenų tipais dirba komponentas.
  • Kodo pakartotinis naudojimas: Galima sukurti vieną komponentą, kuris veikia su skirtingais tipais, vietoje kelių versijų rašymo.
  • Tipų konvertavimo sumažinimas: Vengia būtinybės aiškiai konvertuoti tipus, kas daro kodą švaresnį ir mažiau linkusį į klaidas ClassCastException (kur tai taikoma, pvz., Java).

Generics naudojimo pavyzdžiai:

  • Kolekcijos: Sąrašai (List), rinkiniai (Set), žemėlapiai (Map) gali saugoti tam tikro tipo elementus, užtikrinant, kad į kolekciją nepateks kito tipo elementai.
  • Metodai/funkcijos: Metodas gali dirbti su parametrais arba grąžinti bendro tipo reikšmę.
  • Klasės/sąsajos: Gali būti kuriamos bendros duomenų struktūros arba elgsenos šablonai.

Pavyzdys Java kalba:

// Bendroji poros klasė
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;
    }
}

// Naudojimas
Pair<String, Integer> pair = new Pair<>("Hello", 123);
String str = pair.getFirst(); // Nereikia tipų konvertavimo
int num = pair.getSecond(); // Nereikia tipų konvertavimo

// Netinkamas poravimas
Pair<String, Integer> wrongPair = new Pair<>(123, "Hello"); // Kompiliatoriaus klaida: tipų neatitikimas

C# pavyzdys:

// Bendroji poros klasė
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;
    }
}

// Naudojimas
var pair = new Pair<string, int>("Hello", 123);
string str = pair.First; // Nereikia tipų konvertavimo
int num = pair.Second; // Nereikia tipų konvertavimo

// Netinkamas poravimas
var wrongPair = new Pair<string, int>(123, "Hello"); // Kompiliatoriaus klaida

TypeScript pavyzdys:

// Bendroji funkcija, skirta gauti pirmą elementą iš masyvo
function getFirstElement<T>(arr: T[]): T | undefined {
    if (arr.length > 0) {
        return arr[0];
    }
    return undefined;
}

// Naudojimas
let numbers: number[] = [1, 2, 3];
let firstNumber = getFirstElement(numbers); // firstNumber turi tipą `number`

let words: string[] = ["a", "b", "c"];
let firstWord = getFirstElement(words); // firstWord turi tipą `string`

// let mixedArray: (number | string)[] = [1, "a", 2];
// let firstMixed = getFirstElement(mixedArray); // firstMixed turi tipą `number | string`

Taip, generics yra galingas įrankis kurti lankstų, tipų saugų ir pakartotinai naudojamą kodą.