Sobes.tech
Middle

Чӣ имкониятҳо дар Java бо Generics пешниҳод мешаванд?

sobes.tech AI

Ҷавоб аз AI

Генерикҳо дар Java бехатарии намудҳои кодиҳоро баланд мебардоранд, хатоҳои вақти иҷроиро, ки бо тағир додани намудҳо алоқаманданд, пешгирӣ мекунанд. Имкониятҳои асосӣ:

  • Таҳқиқи намудҳо дар марҳилаи компилятсия: Компилятор дурустии истифодаи намудҳоро, ки дар Генерикҳо зикр шудаанд, санҷида, хатоҳоро пеш аз оғоз кардани барнома ошкор мекунад.

    // Бе Генерикҳо - мумкин ClassCastException
    List list = new ArrayList();
    list.add("сатр");
    list.add(123); // Илова кардани Integer
    String s = (String) list.get(1); // Хатои иҷроӣ
    
    // Бо Генерикҳо - хато дар компилятсия
    List<String> stringList = new ArrayList<>();
    stringList.add("сатр");
    // stringList.add(123); // Хатои компилятсия
    String str = stringList.get(0); // гирифтани бехатар
    
  • Беҷо кардани тағир додани намудҳо (type casting): Генерикҳо ниёз ба тағир додани намудҳои равшанро ҳангоми гирифтани элементҳо аз коллекияҳо ё истифодаи синфҳои параметрӣ бартараф мекунанд.

    // Бе Генерикҳо
    List list = new ArrayList();
    list.add("Салом");
    String s = (String) list.get(0); // Тағйир додани равшан
    
    // Бо Генерикҳо
    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 ва ғайра) параметргузорӣ шудаанд, ки кор бо коллекияҳоро бехатар ва қулай месозад.

Генерикҳо унсури калидии Java-и муосир мебошанд, ки боварнокӣ ва хонданпазирии кодиҳоро баланд мебардоранд.