Sobes.tech
Middle

Šta su Generics i zašto se koriste?

sobes.tech АИ

Одговор од АИ

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

Главна сврха Generics:

  • Повећање типске безбедности: Компилатор проверава типове током компилације, спречавајући ClassCastException током извршавања.
  • Уклањање кастовања типова: Нема потребе за ручним кастовањем приликом извлачења елемената из колекција.
  • Креирање флексибилнијег и поновно коришћеног кода: Може се писати генерализовани алгоритми и структуре података применљиве на различите типове података.

Пример без Generics:

// Пре Јаве 5
import java.util.ArrayList;
import java.util.List;

public class OldStyleList {
    public static void main(String[] args) {
        List list = new ArrayList(); // без типизације
        list.add("hello");
        list.add(123); // може додати било који објекат

        String s = (String) list.get(0); // потребно кастовање типа
        Integer i = (Integer) list.get(1); // потребно кастовање типа

        // Могућа грешка кастовања
        // String error = (String) list.get(1); // ClassCastException
        System.out.println(s);
        System.out.println(i);
    }
}

Пример са Generics:

// Са коришћењем Generics
import java.util.ArrayList;
import java.util.List;

public class GenericList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(); // листа стрингова
        list.add("hello");
        // list.add(123); // грешка компилације - није дозвољено додати Integer

        String s = list.get(0); // нема потребе за кастовањем типа

        // Немогуће додати други тип, спречава грешку
        // List<Integer> intList = new ArrayList<>();
        // intList.add("world"); // грешка компилације
        System.out.println(s);
    }
}

Generics се такође користе у:

  • Класама: ArrayList<E>, HashMap<K, V>
  • Интерфејсима: List<E>, Map<K, V>
  • Методама: <T> void printArray(T[] array)
  • Ограничењима типова: <T extends Comparable<T>> (ограничење на типове који реализују Comparable)

Реализација Generics у Јави заснована је на "стирању типова" (type erasure) у фази компилације. Ово значи да информације о генерисаним типовима бришу, а током извршавања ЈВМ ради са сирим типовима. Ово обезбеђује назадну компатибилност са старим верзијама Јаве, али има одређена ограничења.