Sobes.tech
Middle

Milliseid võimalusi pakuvad Generics Java's?

sobes.tech AI

Vastus AI-lt

Generics Java-s suurendavad koodi tüübi turvalisust, vältides täitmisaegseid vigu, mis on seotud tüüpide ümberkujundamisega. Peamised võimalused:

  • Tüüpide kontroll kompilatsiooni ajal: Kompilaator kontrollib, kas Generics-iga määratud tüübid on õigesti kasutatud, mis võimaldab tuvastada vigu enne programmi käivitamist.

    // Ilma Generics-ita - võimalik ClassCastException
    List list = new ArrayList();
    list.add("rida");
    list.add(123); // Lisab Integer
    String s = (String) list.get(1); // Käivitusviga
    
    // Generics-iga - kompileerimisviga
    List<String> stringList = new ArrayList<>();
    stringList.add("rida");
    // stringList.add(123); // Kompileerimisviga
    String str = stringList.get(0); // Turvaline saamine
    
  • Tüüpide ümberkujundamise (type casting) vältimine: Generics väldivad vajadust teha otseseid tüübimuudatusi, kui saadakse elemente kogumitest või kasutatakse parametriseeritud klasse.

    // Ilma Generics-ita
    List list = new ArrayList();
    list.add("Tere");
    String s = (String) list.get(0); // Otsene tüübimuudatus
    
    // Generics-iga
    List<String> stringList = new ArrayList<>();
    stringList.add("Tere");
    String str = stringList.get(0); // Muudatus ei ole vajalik
    
  • Üldise koodi realiseerimine (Generics Methods, Generics Classes, Generics Interfaces): Annab võimaluse luua üldisi algoritme ja andmestruktuure, mis töötavad erinevat tüüpi, vältides koodi dubleerimist.

    // Üldine meetod massiivi printimiseks
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
    
    // Üldine klass - väärtuste paar
    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 toetus: Annab võimaluse määratleda paindlikke piiranguid tüüpidele parametriseeritud tüüpidel.

    • ? (Piiramatu Wildcard): Iga tüüp.
    • ? extends T (Piiratud Wildcard - Ülemine piir): Tüüp peab olema T või selle alamklass.
    • ? super T (Piiratud Wildcard - Alumine piir): Tüüp peab olema T või selle superklass.
    // Meetod, mis võtab vastu mis tahes tüüpi nimekirja
    public static void processList(List<?> list) {
        // ...
    }
    
    // Meetod, mis võtab vastu arvude või nende alamklasside nimekirja
    public static void processNumbers(List<? extends Number> list) {
        // ...
    }
    
    // Meetod, mis võtab vastu stringide või nende superklasside nimekirja
    public static void addStrings(List<? super String> list) {
        list.add("uus rida");
    }
    
  • Kogumike raamistikus kasutamine: Kõik peamised kogumike klassid (List, Set, Map jms) on parametriseeritud, mis muudab kogumike kasutamise tüübiturvaliseks ja mugavaks.

Generics on kaasaegse Java võtmeelement, mis tõstab koodi usaldusväärsust ja loetavust.