Professional Documents
Culture Documents
11 Generici - Java
11 Generici - Java
programiranje 2
Generici
Uvod
2 Generici 18.04.2017.
Motivacija
Do Jave 1.5:
tip Object korien kao opti tip
Problem kod dohvatanja elemenata iz heterogene zbirke
zbirka sadri objekte koji pripadaju jednoj hijerarhiji tipova
rezultat dohvatanja iz zbirke se mora konvertovati nanie
nebezbedna konverzija
ako nije dohvaen objekat oekivanog tipa BadCastException
Java 1.5 uvodi generike koji reavaju problem
nebezbedna konverzija nanie vie nije potrebna
3 Generici 18.04.2017.
Primer problema
4 Generici 18.04.2017.
Reenje problema
Od Jave 1.5:
generika klasa Stek, zavisi od tipa elemenata T
class Stek <T> {
public void stavi(T t){};
public T uzmi(){};
}
- kreiranje objekta steka diskova:
Stek<Disk> stekDiskova = new Stek<Disk>();
5 Generici 18.04.2017.
Reenje (2)
6 Generici 18.04.2017.
Priroda generika
7 Generici 18.04.2017.
Provera i brisanje tipa
8 Generici 18.04.2017.
Sirovi tip
9 Generici 18.04.2017.
Definisanje generike klase
Generika klasa
moe biti parametrizovana jednim ili pomou vie tipova
koji se pojavljuju kao formalni argumenti (parametri) generika
class ime <T1, T2, , Tn> {}
Parametri Ti se mogu pojaviti:
u deklaraciji polja
kao povratni tip metoda
kao tip parametra metoda ili konstruktora
u deklaraciji lokalne promenljive
u deklaraciji ugneenog tipa
Doseg parametra:
do kraja klase (odosno generikog tipa, metoda ili konstruktora)
10 Generici 18.04.2017.
Ogranienja u definicijama
Formalni parametar generika se ne moe koristiti kao:
tip statikog polja generike klase
u statikim metodima za:
povratni tip, tip parametra metoda, tip lokalne promenljive
u statikim inicijalizacionim blokovima date klase
razlog: postoji samo jedna klasa (sirovi tip)
Statikom lanu klase se ne moe pristupiti
preko parametrizovanog imena tipa
na primer, ako je metod m() statiki metod generike klase A<T>:
nije dozvoljeno A<Integer>.m(), dozvoljeno je A.m()
slino je sa literalom klase:
nije dozvoljeno A<Integer>.class, dozvoljeno je A.class
U A<T> nije dozvoljeno kreirati objekat tipa T, niti niz objekata tipa T
na primer, nije dozvoljeno new T() niti new T[100]
11 Generici 18.04.2017.
Korienje generika
Problem:
u definiciji objekta dva puta se navode argumenti generika
to vie parametara generika, to vei problem
Java 7 reava problem dijamant simbolom
u pozivu konstruktora se mogu izostaviti argumenti tipa
primer: G<String> gS = new G<>();
Prevodilac automatski zakljuuje o tipovima argumenata
na osnovu deklaracije tipa reference sa leve strane =
13 Generici 18.04.2017.
Generici i nizovi
14 Generici 18.04.2017.
Generici, izvoenje i ugneenje
15 Generici 18.04.2017.
Ogranienje parametra
16 Generici 18.04.2017.
Razlog za dokere
Problem:
G<IT> nije podtip tipa G<T>, gde je IT tip izveden iz tipa T
Razliito od nizova:
niz IT[] je podtip tipa T[]
Primer: za generiki stek Stek<T>
Stek<String> nije jedna vrsta Stek<Object>
String[] jeste jedna vrsta Object[]
U praksi ovo predstavlja prilino ogranienje
Nain da se ono prevazie dokeri
17 Generici 18.04.2017.
Neogranieni doker
18 Generici 18.04.2017.
Ogranienje gornje granice tipa
19 Generici 18.04.2017.
Hijerarhija tipova
G<?>
Object
G<Object> G<String> G<? extends E>
EI
G<EII>
20 Generici 18.04.2017.
Ogranienje donje granice tipa
21 Generici 18.04.2017.
Ogranienja ogranienih dokera
22 Generici 18.04.2017.
Nizovi objekata generike klase
23 Generici 18.04.2017.
Generiki metodi
24 Generici 18.04.2017.