Sobes.tech
Middle

Koje mogućnosti pružaju Generics u Javi?

sobes.tech АИ

Одговор од АИ

Generici u Javi povećavaju sigurnost tipova koda, sprečavajući greške tokom izvršavanja povezane sa prebacivanjem tipova. Glavne mogućnosti:

  • Provera tipova u fazi kompajliranja: Kompajler proverava ispravnost korišćenja tipova navedenih u genericima, što omogućava otkrivanje grešaka pre pokretanja programa.

    // Bez generika - moguća ClassCastException
    List list = new ArrayList();
    list.add("string");
    list.add(123); // Dodavanje Integer
    String s = (String) list.get(1); // Greška tokom izvršavanja
    
    // Sa genericima - greška pri kompajliranju
    List<String> stringList = new ArrayList<>();
    stringList.add("string");
    // stringList.add(123); // Greška pri kompajliranju
    String str = stringList.get(0); // Sigurno dobijanje
    
  • Uklanjanje prebacivanja tipova (type casting): Generici uklanjaju potrebu za eksplicitnim prebacivanjem tipova pri dobijanju elemenata iz kolekcija ili korišćenju parametrizovanih klasa.

    // Bez generika
    List list = new ArrayList();
    list.add("Zdravo");
    String s = (String) list.get(0); // Eksplicitno prebacivanje
    
    // Sa genericima
    List<String> stringList = new ArrayList<>();
    stringList.add("Zdravo");
    String str = stringList.get(0); // Nije potrebno prebacivanje
    
  • Opšti kod (Generics Methods, Generics Classes, Generics Interfaces): Omogućavaju kreiranje opštih algoritama i struktura podataka koji rade sa različitim tipovima, bez dupliranja koda.

    // Opšta metoda za štampu niza
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
    
    // Opšta klasa - par vrednosti
    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; }
    }
    
  • Podrška za Wildcards: Omogućavaju definisanje fleksibilnih ograničenja na tipove u parametrizovanim tipovima.

    • ? (Unbounded Wildcard): Bilo koji tip.
    • ? extends T (Bounded Wildcard - Gornja granica): Tip mora biti T ili njegov podtip.
    • ? super T (Bounded Wildcard - Donja granica): Tip mora biti T ili njegov supertip.
    // Metod koji prihvata listu bilo kog tipa
    public static void processList(List<?> list) {
        // ...
    }
    
    // Metod koji prihvata listu brojeva ili njihovih podtipova
    public static void processNumbers(List<? extends Number> list) {
        // ...
    }
    
    // Metod koji prihvata listu stringova ili njihovih supertipova
    public static void addStrings(List<? super String> list) {
        list.add("nova linija");
    }
    
  • Korišćenje u Collections Framework-u: Sve glavne klase kolekcija (List, Set, Map i dr.) su parametrizovane, što čini rad sa kolekcijama tipobezbednim i jednostavnim.

Generici su ključni element savremene Jave, povećavaju pouzdanost i čitljivost koda.