Sobes.tech
Middle

Ինչ հնարավորություններ են ներկայացնում Java-ի Generics-ը:

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-ի համար, բարձրացնում են կոդի հուսալիությունը և ընթերցանությունը։