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 tipaT. - 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 jeList<Integer>). - Nije moguće direktno kreirati nizove generičkih tipova (npr.
T[] array = new T[10]- netačno, potrebno je koristitiArrayListili 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 podtipoviT. Može da čita elemente tipaTili njegovih supertipova, ali ne i da piše (osimnull).<? super T>: Donja ograničenja. Omogućava rad sa tipovima koji su supertipoviT. Može da piše elemente tipaTili njegovih podtipova, ali može samo da čita elemente tipaObject.
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
}