Sobes.tech
Middle

Kas yra generikai?

sobes.tech AI

Atsakymas iš AI

Bendrai (Generics) yra mechanizmas, leidžiantis rašyti klases, sąsajas ir metodus, kurie veikia su skirtingų tipų duomenimis, tačiau tuo pačiu užtikrina tipų saugumą kompiliavimo metu. Jie leidžia kurti pakartotinai naudojamas komponentes, kurios gali dirbti su bet kokio tipo duomenimis, neprarandant informacijos apie tipą, kas sumažina klaidų, susijusių su tipų konvertavimu, tikimybę vykdymo metu.

Pagrindiniai privalumai:

  • Tipų saugumas: Kompiliatorius tikrina teisingą tipų naudojimą bendrose struktūrose.
  • Kodo kiekio mažinimas: Vienas bendras klasės ar metodo pavyzdys gali dirbti su daugybe tipų.
  • Kodo skaitomumas: Aiškiai matyti, su kokiais tipais dirba komponentas.
  • Našumo didinimas (kai kuriais atvejais): Nereikia konvertuoti tipų vykdymo metu, tai gali šiek tiek pagerinti našumą.

Pavyzdys (Java):

// Bendrojo klasės pavyzdys
class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

// Naudojimas su skirtingais tipais
Box<Integer> integerBox = new Box<>();
integerBox.setContent(10);
int value = integerBox.getContent(); // Tipų saugumas, nereikia konvertuoti į int

Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
String text = stringBox.getContent(); // Tipų saugumas, nereikia konvertuoti į String

Pavyzdys (Python - Type Hinting, artimas Generics):

from typing import TypeVar, Generic

T = TypeVar('T')

class Box(Generic[T]):
    def __init__(self) -> None:
        self._content: T | None = None

    def set_content(self, content: T) -> None:
        self._content = content

    def get_content(self) -> T | None:
        return self._content

# Naudojimas su tipų nurodymais
integer_box: Box[int] = Box()
integer_box.set_content(10)
value: int | None = integer_box.get_content() # Padeda statinio analizės įrankiams

string_box: Box[str] = Box()
string_box.set_content("Hello")
text: str | None = string_box.get_content() # Padeda statinio analizės įrankiams