Professional Documents
Culture Documents
Java Genericki Tipovi
Java Genericki Tipovi
• PovezanaLista.java
• Klasa ClanListe je unutrašnja ( ugnježdena nestatička )
• Definicija generičkog tipa može sadržati obične metode koji ne
uključuju nikakve parametre u svojim definicijama kao i metode sa
parametrima
• Sada imamo generički tip PovezanaLista<T> koji možemo koristiti
da kreiramo novu klasu PovezanaLista za smeštanje objekata
proizvoljnog tipa. Pogledajmo kako da ga koristimo
Instanciranje generičkog tipa
• Da bismo definisali novi tip, koristimo ime generičkog tipa praćeno
imenom klasnog ili interfejsnog tipa unutar <> zagrada. Npr.
PovezanaLista<String> stringovi; // prom. tipa PovezanaLista<String>
• Ovo samo definiše promenljivu imena stringovi
• Tip ove promenljive je PovezanaLista<String>
• Kao rezultat ove naredbe, kompajler će koristiti tipski argument
String koji smo obezbedili da zameni svaku instancu tipske
promenljive T u definiciji generičkog tipa kako bi došao do definicije
za klasni tip PovezanaLista<String>
• Naravno, kada definišemo promenljivu, možemo definisati objekat:
PovezanaLista<String> stringovi = new PovezanaLista<String>();
• Ovim se poziva podrazumevani konstruktor klasnog tipa
PovezanaLista<String> da definiše objekat koji implementira
povezanu listu String objekata
Instanciranje generičkog tipa
• Argument koji prosleđujemo generičkom tipu takođe može biti i tipa
koji definišemo korišćenjem generičkog tipa. Npr.
PovezanaLista<PovezanaLista<String>> tekstovi =
new PovezanaLista<PovezanaLista<String>>();
• Ovde smo definisali povezanu listu povezanih lista
• Da bismo primenili novi generički tip PovezanaLista<> pišemo
PolyLine koristeći tip generisan iz generičkog tipa PovezanaLista<>
• TestGenericPovezanaLista
Komentarisanje programa
• Klasa Polyline kreira tip PovezanaLista<Point> od generičkog tipa
PovezanaLista<T> koji će implementirati povezanu listu Point
objekata:
private PovezanaLista<Point> polyline;
• Metodi u parametrizovanom tipu se koriste na isti način kao oni u
originalnoj definiciji klase PovezanaLista koja je implementirana bez
upotrebe generičkih klasnih tipova.
Upotreba Wrapper klasa primitivnih
tipova kao argumenata
• U slučaju da želimo da smeštamo vrednosti primitivnog tipa u
kolekciju poput povezane liste, koristimo generički tip sa nekom od
Wrapper klasa kao tipskim argumentom. To su klase Integer, Short,
Double itd. definisane u paketu java.lang
• Npr. za upotrebu generičkog tipa PovezanaLista<T> za smeštanje
vrednosti tipa double:
PovezanaLista<Double> temperature = new PovezanaLista<Double>();
• Ovde smo kreirali povezanu listu za smeštanje objekata tipa Double,
a autoboxing omogućuje da se objekat PovezanaLista<Double>
koristi direktno sa vrednostima tipa double. Npr. da bismo efektivno
dodali vrednost tipa double povezanoj listi koju smo upravo kreirali:
temperature.dodajClan(10.5);
• Pošto je tipski parametar za ovaj metod za objekat tipa
PovezanaLista<Double> tipa Double, kompajler će automatski
ubaciti boxing konverziju za konvertovanje double vrednosti 10.5 u
objekat tipa Double koji je enkapsulira.
Višestruki parametri tipa
• Generički tip PovezanaLista<T> ima jedan parametar tipa , T.
• U opštem slučaju može se definisati generički tip sa proizvoljnim
brojem parametara.
• Npr. generički tip koji definiše skup klasa koje enkapsuliraju par
objekata proizvoljnih tipova. To se tipično događa kada se 1 objekat
koristi kao ključ za pristup drugom u kolekciji. Npr.
public class Par<KljucTip, VrednostTip>{
// Konstruktor
public Par(KljucTip kljuc, VrednostTip vrednost){
this.kljuc=kljuc;
this.vrednost=vrednost;
}
// get*() i set*() metodi
private KljucTip kljuc;
private VrednostTip vrednost;
}
Višestruki parametri tipa
• Praktična definicija će biti komplikovanija od ove, npr. biće potrebno
sredstvo za poređenje ključeva, ali ova definicija je dovoljna za
demonstriranje korišćenja 2 parametra u definiciji generičkog tipa.
• Primer korišćenja ovog generičkog tipa:
Par<String,String> unos = new Par<String,String>(
"Petar Petrovic","212 222 3333");
• kreira se objekat tipa Par<String,String> i referenca na njega se
smešta u promenljivu unos.
Opseg tipskog parametra
• Opseg tipskog parametra je cela definicija generičke klase, ali
isključujući statičke članove i inicijalizatore u klasi.
• To povlači da se unutar definicije generičkog tipa ne može naći
statički atribut tipa tipske promenljive.
• Slično, statički metodi ne mogu imati parametre ili povratne tipove
koji su tipa tipske promenljive
• Tipske promenljive se ne mogu koristiti u telima definicija statičkih
metoda
• To ne znači da statički metodi ne mogu biti parametrizovani – ovde
je reč samo o tipskim promenljivim odgovarajućim za parametre
definicije generičkog tipa, a postoje i tzv. generički metodi koji imaju
svoju nezavisnu parametrizovanu definiciju koja uključuje sopstveni
skup parametara, i takvi parametrizovani metodi mogu biti statički ili
nestatički
Generički (parametrizovani) metodi
• Moguće je definisati metod sa sopstvenim nezavisnim skupom od 1
ili više tipskih parametara, čime se dobija parametrizovani metod ili
generički metod
• Možemo imati parametrizovane metode i u običnoj klasi
• Metodi unutar definicije generičkog tipa takođe mogu imati
nezavisne parametre. Npr.
public static <T> void listAll(PovezanaLista<T> list){
for(T obj: list)
System.out.println(obj);
}
Generički (parametrizovani) metodi
• <T> nakon ključnih reči public i static je lista tipskih parametara za
generički metod. Ovde imamo samo jedan tipski parametar, T, ali
može ih biti i više.
• Lista tipskih parametara za generički metod se uvek ograđuje <>
zagradama i treba da prati eventualne modifajere poput public i
static i treba da prethodi povratnom tipu.
• Generički konstruktori: konstruktor je specijalizovana vrsta metoda i
može se definisati i konstruktor sa sopstvenim nezavisnim
parametrima. Parametrizovani konstruktori se mogu definisati i za
generičke i za obične klasne tipove
Parametrizovani tipovi i nasleđivanje
• Klasu je moguće definisati kao potklasu klasnog tipa koji je instanca
generičkog tipa
• Metodi i atributi će biti nasleđeni od bazne klase na uobičajeni način
• Mora se voditi računa da se u izvedenoj klasi ne definišu metodi koji
imaju isti potpis kao neki nasleđeni metod.