Sobes.tech
Middle

Какво са Generics и за какво се използват?

sobes.tech AI

Отговор от AI

Генериците в Java позволяват създаването на класове, интерфейси и методи, които работят с параметризирани типове.

Основната цел на Generics:

  • Повишаване на типовата безопасност: Компилаторът проверява типовете по време на компилация, предотвратявайки ClassCastException по време на изпълнение.
  • Премахване на нуждата от преобразуване на типове: Не е необходимо ръчно да преобразувате типовете при извличане на елементи от колекции.
  • Създаване на по-гъвкав и повторно използваем код: Можете да пишете общи алгоритми и структури от данни, приложими към различни типове данни.

Пример без Generics:

// Преди Java 5
import java.util.ArrayList;
import java.util.List;

public class OldStyleList {
    public static void main(String[] args) {
        List list = new ArrayList(); // без типизация
        list.add("здравей");
        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("здравей");
        // list.add(123); // грешка при компилация - не може да добави Integer

        String s = list.get(0); // без нужда от преобразуване

        // Не е възможно да добавите друг тип, предотвратява грешки
        // List<Integer> intList = new ArrayList<>();
        // intList.add("свят"); // грешка при компилация
        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 в Java е базирана на "изтриване на типове" (type erasure) по време на компилация. Това означава, че информацията за генеричните типове се премахва, и по време на изпълнение JVM работи с сурови типове. Това осигурява съвместимост с по-старите версии на Java, но има някои ограничения.