Sobes.tech
Middle

Какви възможности предоставят Generics в Java?

sobes.tech AI

Отговор от AI

Обобщените типове (Generics) в Java увеличават безопасността на типовете на кода, предотвратявайки грешки по време на изпълнение, свързани с преобразуване на типове. Основни възможности:

  • Проверка на типовете по време на компилация: Компилаторът проверява правилната употреба на типовете, посочени в Generics, което позволява откриване на грешки преди стартирането на програмата.

    // Без Generics - възможно ClassCastException
    List list = new ArrayList();
    list.add("низ");
    list.add(123); // Добавяне на Integer
    String s = (String) list.get(1); // Грешка по време на изпълнение
    
    // С Generics - грешка при компилация
    List<String> stringList = new ArrayList<>();
    stringList.add("низ");
    // stringList.add(123); // Грешка при компилация
    String str = stringList.get(0); // Безопасно получаване
    
  • Премахване на преобразувания на типове (type casting): Generics премахват необходимостта от явни преобразувания при получаване на елементи от колекции или използване на параметризирани класове.

    // Без Generics
    List list = new ArrayList();
    list.add("Здравей");
    String s = (String) list.get(0); // Явно преобразуване
    
    // С Generics
    List<String> stringList = new ArrayList<>();
    stringList.add("Здравей");
    String str = stringList.get(0); // Не се изисква преобразуване
    
  • Общ код (Generics Methods, Generics Classes, Generics Interfaces): Позволяват създаването на обобщени алгоритми и структури от данни, работещи с различни типове, без дублиране на код.

    // Обобщен метод за отпечатване на масив
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
    
    // Обобщен клас - двойка стойности
    class Pair<K, V> {
        private K key;
        private V value;
    
        public Pair(K key, V value) {
            this.key = key;
            this.value = value;
        }
    
        public K getKey() { return key; }
        public V getValue() { return value; }
    }
    
  • Поддръжка на Wildcards: Позволяват дефиниране на гъвкави ограничения върху типовете в параметризирани типове.

    • ? (Unbounded Wildcard): Всеки тип.
    • ? extends T (Bounded Wildcard - горна граница): Типът трябва да бъде T или негов подтип.
    • ? super T (Bounded Wildcard - долна граница): Типът трябва да бъде T или негов супертруп.
    // Метод, който приема списък от произволен тип
    public static void processList(List<?> list) {
        // ...
    }
    
    // Метод, който приема списък от числа или техни подтипове
    public static void processNumbers(List<? extends Number> list) {
        // ...
    }
    
    // Метод, който приема списък от низове или техните супертрупи
    public static void addStrings(List<? super String> list) {
        list.add("нов низ");
    }
    
  • Използване в Collections Framework: Всички основни класове колекции (List, Set, Map и др.) са параметризирани, което прави работата с колекции типобезопасна и удобна.

Generics са ключов елемент на съвременната Java, увеличавайки надеждността и четливостта на кода.