Sobes.tech
Middle

Šta su generici (Generics) u programiranju?

sobes.tech АИ

Одговор од АИ

Обобщења (Generics) су механизам у језицима програмирања који омогућава креирање компоненти (класа, интерфејса, метода/функција) које раде са различитим типовима података, а да при том не губе типску безбедност и без потребе за кастовањем (casting).

Главни циљеви коришћења Generics:

  • Повећање типске безбедности: Компилатор проверава типове у току компилације, откривајући грешке пре извршавања програма.
  • Побољшање читљивости кода: Јасно је са којим типовима података рад компонента.
  • Поновна употреба кода: Може се креирати једна компонента која ради са различитим типовима, уместо да се пишу више верзија.
  • Смањење кастовања: Избегава потребу за јасним кастовањем, што чини код чистијим и мање подложним грешкама ClassCastException (у језицима где је то применљиво, нпр. Java).

Примери коришћења Generics:

  • Колекције: Листе (List), скупови (Set), мапе (Map) могу чувати елементе одређеног типа, што гарантује да у колекцију неће ући елементи другог типа.
  • Методе/функције: Метод може радити са параметрима или враћати вредност опште врсте.
  • Класе/интерфејси: Могу се креирати опште структуре података или шаблони понашања.

Пример у Јави:

// Општа класа пар
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;
    }
}

// Коришћење
Pair<String, Integer> pair = new Pair<>("Hello", 123);
String str = pair.getFirst(); // Нема потребе за кастовањем
int num = pair.getSecond();   // Нема потребе за кастовањем

// Неправилна паровања
Pair<String, Integer> wrongPair = new Pair<>(123, "Hello"); // Грешка компајлера: несагласност типова

Пример у C#:

// Општа класа 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;
    }
}

// Коришћење
var pair = new Pair<string, int>("Hello", 123);
string str = pair.First; // Нема потребе за кастовањем
int num = pair.Second;   // Нема потребе за кастовањем

// Неправилна паровања
var wrongPair = new Pair<string, int>(123, "Hello"); // Грешка компајлера

Пример у TypeScript:

// Генеричка функција за добијање првог елемента низа
function getFirstElement<T>(arr: T[]): T | undefined {
    if (arr.length > 0) {
        return arr[0];
    }
    return undefined;
}

// Коришћење
let numbers: number[] = [1, 2, 3];
let firstNumber = getFirstElement(numbers); // firstNumber има тип number

let words: string[] = ["a", "b", "c"];
let firstWord = getFirstElement(words);   // firstWord има тип string

// let mixedArray: (number | string)[] = [1, "a", 2];
// let firstMixed = getFirstElement(mixedArray); // firstMixed има тип number | string

Дакле, Generics представљају моћан алат за креирање флексибилног, типобезбедног и поновно коришћеног кода.