Sobes.tech
Middle

Koje su mogućnosti u Generics?

sobes.tech АИ

Одговор од АИ

Generici omogućavaju kreiranje parametarskih klasa, interfejsa i metoda.

Glavne mogućnosti:

  • Ponovna upotreba koda: Kreiranje univerzalnih struktura podataka i algoritama koji rade sa bilo kojim tipovima.
  • Bezbednost tipova tokom kompilacije: Greške u tipovima se otkrivaju u fazi kompilacije, a ne tokom izvršavanja. Uklanja potrebu za ručnim konvertovanjem tipova i povezanim potencijalnim greškama ClassCastException.
  • Poboljšana čitljivost: Kod postaje jasniji jer eksplicitno ukazuje sa kojim tipovima radi.

Primeri:

  • Klasa-kontejner List<T> može da čuva elemente bilo kog tipa T.
  • Metod static <T> T getFirst(List<T> list) može da vraća prvi element sa liste bilo kog tipa.

Ograničenja Generics:

  • Nije moguće kreirati instance generičkog tipa: new T().
  • Nije moguće koristiti primitivne tipove kao parametre tipova (npr. List<int> - netačno, potrebno je List<Integer>).
  • Nije moguće direktno kreirati nizove generičkih tipova (npr. T[] array = new T[10] - netačno, potrebno je koristiti ArrayList ili konverziju tipova).
  • Nije moguće koristiti statička polja generičkog tipa direktno.
  • Informacije o tipovima se brišu tokom izvršavanja (Type Erasure), osim bounded wildcards.

Wildcards i Bounded Type Parameters:

  • <?>: Nepoznat tip. Omogućava čitanje elemenata, ali ne i pisanje.
  • <? extends T>: Gornja ograničenja. Omogućava rad sa tipovima koji su podtipovi T. Može da čita elemente tipa T ili njegovih supertipova, ali ne i da piše (osim null).
  • <? super T>: Donja ograničenja. Omogućava rad sa tipovima koji su supertipovi T. Može da piše elemente tipa T ili njegovih podtipova, ali može samo da čita elemente tipa Object.

Primer:

// Metod koji može da štampa elemente iz bilo koje liste,
// koja sadrži podtipove Number
public static void printNumbers(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
    // list.add(new Integer(1)); // Greška tokom kompilacije
}

// Metod koji može da dodaje Integer u listu,
// koja sadrži Integer ili njegove supertipove
public static void addIntegers(List<? super Integer> list) {
    list.add(new Integer(10));
    // Integer val = list.get(0); // Greška tokom kompilacije, vraća Object
}