Sobes.tech
Middle

Какви са възможностите в Generics?

sobes.tech AI

Отговор от AI

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

Основни възможности:

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

Примери:

  • Класът контейнер List<T> може да съхранява елементи от всякакъв тип T.
  • Методът static <T> T getFirst(List<T> list) може да връща първия елемент от списък от всякакъв тип.

Ограничения на Generics:

  • Не е възможно да се създават екземпляри на обобщени типове: new T().
  • Не може да се използват примитивни типове като параметри на тип (например, List<int> - неправилно, трябва да се използва List<Integer>).
  • Не може да се създават масиви от обобщени типове директно (например, T[] array = new T[10] - неправилно, трябва да се използва ArrayList или преобразуване).
  • Не може да се използват статични полета на обобщени типове директно.
  • Информацията за типовете се изтрива по време на изпълнение (Type Erasure), с изключение на ограничените wildcards.

Wildcards и ограничени параметри на типове:

  • <?>: Неизвестен тип. Позволява четене на елементи, но не и писане.
  • <? extends T>: Ограничение отгоре. Позволява работа с типове, които са подтипове на T. Може да чете елементи от тип T или неговите супертипове, но не може да пише (освен null).
  • <? super T>: Ограничение отдолу. Позволява работа с типове, които са супертипове на T. Може да пише елементи от тип T или неговите подтипове, но при четене може да се получи само Object.

Пример:

// Метод, който може да отпечатва елементи от всякакъв списък, съдържащ подтипове на Number
public static void printNumbers(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
    // list.add(new Integer(1)); // Грешка при компилация
}

// Метод, който може да добавя Integer към списък,
// който съдържа Integer или негови супертипове
public static void addIntegers(List<? super Integer> list) {
    list.add(new Integer(10));
    // Integer val = list.get(0); // Грешка при компилация, връща Object
}