{"id":31,"date":"2014-05-26T12:06:23","date_gmt":"2014-05-26T12:06:23","guid":{"rendered":"http:\/\/vkrastev1blog.com\/?p=31"},"modified":"2014-05-26T15:36:27","modified_gmt":"2014-05-26T15:36:27","slug":"java-generics-explained-in-short-form-with-examples","status":"publish","type":"post","link":"https:\/\/vkrastev1blog.com\/2014\/05\/26\/java-generics-explained-in-short-form-with-examples\/","title":{"rendered":"Java generici obja\u0161njeni u kratkom obliku s primjerima"},"content":{"rendered":"<p>Za vi\u0161e informacija pogledajte ovaj FAQ:<\/p>\n<p><a href=\"http:\/\/www.angelikalanger.com\/GenericsFAQ\/JavaGenericsFAQ.html#SECTION1\" rel=\"nofollow\">http:\/\/www.angelikalanger.com\/GenericsFAQ\/JavaGenericsFAQ.html#SECTION1<\/a><\/p>\n<p>Evo ukratko nekih va\u017enih to\u010daka iz ovog FAQ-a.<\/p>\n<p>Primjer (generi\u010dkog tipa):<\/p>\n<blockquote><p><tt> klasa Pair&lt;X,Y&gt; {\u00a0<\/tt><br \/>\n<tt> \u00a0 privatni X prvi;<\/tt><br \/>\n<tt> \u00a0 privatni Y drugi;<\/tt><tt> \u00a0 javni par(X a1, Y a2) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 prvi = a1;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 drugi = a2;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 public X getFirst() { return prvi; }<\/tt><br \/>\n<tt> \u00a0 public Y getSecond() { return second; }<\/tt><br \/>\n<tt> \u00a0 public void setFirst(X arg)\u00a0 { first = arg; }<\/tt><br \/>\n<tt> \u00a0 public void setSecond(Y arg) { second = arg; }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>razred <tt> Par<\/tt> ima dva parametra tipa <tt> X <\/tt> i <tt> Y<\/tt> .\u00a0 Zamjenjuju se argumentima tipa kada je generi\u010dki tip <tt> Par<\/tt> se instancira. Na primjer, u deklaraciji <tt> Par&lt;Niz, Datum&gt;<\/tt> parametar tipa <tt> X<\/tt> zamjenjuje se argumentom tipa <tt> Niz<\/tt> i <tt> Y<\/tt> zamjenjuje se sa\u00a0 <tt> Datum<\/tt> .<br \/>\nOpseg identifikatora <tt> X <\/tt> i <tt> Y<\/tt> je<b> <i> <\/i> <\/b> cijela definicija klase.\u00a0 U ovom opsegu dva tipa parametara <tt> X <\/tt> i <tt> Y<\/tt> koriste se kao da su tipovi (uz odre\u0111ena ograni\u010denja). U gornjem primjeru, parametri tipa koriste se kao argument i tip povrata metoda instance i tipova polja instance.<br \/>\nParametri tipa mogu se deklarirati s granicama. Granice daju pristup metodama nepoznatog tipa za koje se zala\u017ee parametar tipa. U na\u0161em primjeru ne pozivamo metode nepoznatih vrsta <tt> X <\/tt> i <tt> Y<\/tt> . Zbog toga su dva parametra tipa neograni\u010dena.<\/p>\n<p>Primjer (konkretnog parametriziranog tipa):<\/p>\n<blockquote><p><tt> public void printPair(<b> <span style=\"color:#000099;\"> Par&lt;String, Long&gt;<\/span> <\/b> par) {<\/tt><br \/>\n<tt> \u00a0 System.out.println(\"(\"+pair.getFirst()+\",\"+pair.getSecond()+\")\");<\/tt><br \/>\n<tt> }<\/tt><tt> <b> <span style=\"color:#000099;\"> Par&lt;String, Long&gt;<\/span> <\/b> granica = novo <b> <span style=\"color:#000099;\"> Par&lt;String, Long&gt;<\/span> <\/b> (\"maksimum\", 1024L);<\/tt><br \/>\n<tt> printPair(ograni\u010denje);<\/tt><\/p><\/blockquote>\n<p>Primjer (parametriziranog tipa zamjenskog znaka):<\/p>\n<blockquote>\n<blockquote><p><tt> public void printPair(<b> <span style=\"color:#000099;\"> Par&lt;?,?&gt;<\/span> <\/b> par) {<\/tt><br \/>\n<tt> \u00a0 System.out.println(\"(\"+pair.getFirst()+\",\"+pair.getSecond()+\")\");<\/tt><br \/>\n<tt> }<\/tt><tt> <b> <span style=\"color:#000099;\"> Par&lt;?,?&gt;<\/span> <\/b> granica = novo <b> <span style=\"color:#000099;\"> Par&lt;String, Long&gt;<\/span> <\/b> (\"maksimum\", 1024L);<\/tt><br \/>\n<tt> printPair(ograni\u010denje);<\/tt><\/p><\/blockquote>\n<\/blockquote>\n<p>Sve instance generi\u010dkog tipa dijele isti prikaz tipa vremena izvo\u0111enja, naime prikaz sirovog tipa. Na primjer, instancije generi\u010dkog tipa <tt> Popis<\/tt> , kao \u0161to je <tt> Popis&lt;Datum&gt;<\/tt> , <tt> Popis&lt;Niz&gt;<\/tt> , <tt> Popis&lt;Long&gt;<\/tt> , itd. imaju razli\u010dite stati\u010dke tipove u vrijeme prevo\u0111enja, ali isti dinami\u010dki tip <tt> Popis <\/tt> u vrijeme izvo\u0111enja.<\/p>\n<p>Gluma\u010dka postava sastoji se od dva dijela:<\/p>\n<ul>\n<li>stati\u010dka provjera tipa koju provodi kompilator u vrijeme kompajliranja i<\/li>\n<li>dinami\u010dka provjera tipa koju izvodi virtualni stroj tijekom izvo\u0111enja.<\/li>\n<\/ul>\n<p>Stati\u010dki dio razvrstava besmislene glumce koji ne mogu uspjeti, poput gluma\u010dke postave iz <tt> Niz<\/tt> da <tt> Datum<\/tt> ili od <tt> Popis&lt;Niz&gt;<\/tt> da <tt> Popis&lt;Datum&gt;<\/tt> .<\/p>\n<p>Dinami\u010dki dio koristi informacije o vrsti vremena izvo\u0111enja i provodi provjeru tipa za vrijeme izvo\u0111enja.\u00a0 Podi\u017ee a <tt> ClassCastException<\/tt> ako dinami\u010dki tip objekta nije ciljni tip (ili podtip ciljnog tipa) cast. Primjeri odljeva s dinami\u010dnim dijelom su odljev iz <tt> Objekt<\/tt> da <tt> Niz<\/tt> ili od <tt> Objekt<\/tt> da <tt> Popis&lt;Niz&gt;<\/tt> .\u00a0 To su tzv. downcast-ovi, od nadtipa prema dolje prema podtipu.<\/p>\n<p>Primjeri konkretnih parametriziranih tipova su <tt> Popis&lt;Niz&gt;<\/tt> , <tt> Map&lt;String,Date&gt;<\/tt> , ali ne <tt> Popis&lt;? produ\u017eava Broj&gt;<\/tt> ili <tt> Map&lt;String,?&gt;<\/tt> .<\/p>\n<p>Ponekad se o\u010dekuje da a <tt> Popis&lt;Objekt&gt;<\/tt> bio bi supertip a <tt> Popis&lt;Niz&gt;<\/tt> , jer <tt> Objekt<\/tt> je supertip od <tt> Niz<\/tt> .\u00a0 Ovo o\u010dekivanje proizlazi iz \u010dinjenice da takva vrsta odnosa postoji za nizove:\u00a0 <tt> Objekt[]<\/tt> je supertip od <tt> Niz[]<\/tt> , jer <tt> Objekt<\/tt> je supertip od <tt> Niz<\/tt> . (Ovaj tip odnosa je poznat kao <i> kovarijanca<\/i> .) Odnos super-podtipa tipova komponenti prote\u017ee se u odgovaraju\u0107e tipove polja. Ne postoji takav odnos tipa za instancije generi\u010dkih tipova. (Parametrizirani tipovi su <i> ne<\/i> kovarijanta.)<\/p>\n<p>Nedostatak super-podtipskog odnosa me\u0111u instancacijama istog generi\u010dkog tipa ima razli\u010dite posljedice.\u00a0 Evo primjera.<\/p>\n<p>Primjer:<\/p>\n<p><tt> void printAll(ArrayList&lt;Object&gt; c) {<\/tt><br \/>\n<tt> \u00a0 za (Objekt o : c)\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 System.out.println(o);<\/tt><br \/>\n<tt> }<\/tt><tt> ArrayList&lt;String&gt; popis = novi ArrayList&lt;String&gt;();<\/tt><br \/>\n<tt> ...ispunite popis...<\/tt><br \/>\n<tt> ispisSve(popis);\u00a0\u00a0 \/\/ pogre\u0161ka<\/tt><\/p>\n<p>A <tt> ArrayList&lt;String&gt;<\/tt> objekt se ne mo\u017ee proslijediti kao argument metodi koja tra\u017ei a <tt> ArrayList&lt;Object&gt;<\/tt> jer su dva tipa instancije istog generi\u010dkog tipa, ali za <i> druga\u010diji<\/i> tip argumente, i iz tog razloga oni nisu me\u0111usobno kompatibilni.<\/p>\n<p>Konkretni parametrizirani tipovi su konkretne instancije generi\u010dkog tipa.\u00a0 Oni su gotovo kao tipovi; postoji samo nekoliko ograni\u010denja.\u00a0 NE mogu se koristiti u sljede\u0107e svrhe:<\/p>\n<ul>\n<li>za stvaranje nizova<\/li>\n<li>u rukovanju iznimkama<\/li>\n<li>u klasnom literalu<\/li>\n<li>u an <tt> instanceof<\/tt> izraz<\/li>\n<\/ul>\n<p>Nizovi koji sadr\u017ee elemente \u010diji je tip konkretan parametrizirani tip su nedopu\u0161teni.<\/p>\n<p>Primjer (nedopu\u0161tenog tipa polja):<\/p>\n<p><tt> static void test() {<\/tt><br \/>\n<tt> \u00a0 <b> <span style=\"color:#660000;\"> Par&lt;Integer,Integer&gt;[]<\/span> <\/b> intPairArr = novo <b> <span style=\"color:#660000;\"> Par&lt;Cijeli broj,Cijeli broj&gt;[10]<\/span> <\/b> ; <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 dodajElemente(intPairArr);\u00a0<\/tt><br \/>\n<tt> \u00a0 Pair&lt;Integer,Integer&gt; pair = intPairArr[1];<\/tt><br \/>\n<tt> \u00a0 Cijeli broj i = pair.getFirst();<\/tt><br \/>\n<tt> \u00a0 pair.setSecond(i);<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> static void addElements(<b> Objekt[]<\/b> objArr) {<\/tt><br \/>\n<tt> \u00a0 objArr[0] = novi Par&lt;Integer,Integer&gt;(0,0);<\/tt><br \/>\n<tt> \u00a0 objArr[1] = novi Pair&lt;String,String&gt;(\"\",\"\");\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ trebao bi uspjeti s ArrayStoreException<\/tt><br \/>\n<tt> }<\/tt><\/p>\n<p>Kompajler zabranjuje stvaranje nizova \u010diji je tip komponente konkretan parametrizirani tip, kao \u0161to je <tt> Par&lt;Cijeli broj,Cijeli broj&gt;<\/tt> u na\u0161em primjeru.\u00a0 U prethodnom unosu raspravljali smo o tome za\u0161to je razumno da kompilator kvalificira a<span style=\"color:#000000;\"> <tt> Par&lt;Integer,Integer&gt;[]<\/tt> <\/span> kao nezakonito.\u00a0 Klju\u010dni problem je taj \u0161to kompajler i runtime sustav moraju osigurati da niz bude a <i> homogena<\/i> niz elemenata iste vrste.\u00a0 Jedna od tipskih provjera, naime array-store-check koju izvodi virtualni stroj tijekom izvo\u0111enja, ne uspijeva otkriti uvredljivo umetanje vanzemaljskog elementa. U primjeru drugo umetanje u <tt> addElements<\/tt> metoda bi trebala biti neuspje\u0161na, jer su dodavali par nizova nizu integralnih vrijednosti, ali ne pada na o\u010dekivani na\u010din. O razlozima je bilo rije\u010di u prethodnom unosu.<\/p>\n<p>Ako ne mo\u017eemo koristiti nizove koji sadr\u017ee elemente \u010diji je tip konkretan parametrizirani tip, \u0161to \u0107emo koristiti kao zaobilazno rje\u0161enje?<\/p>\n<p>Razmotrimo 3 mogu\u0107a rje\u0161enja:<\/p>\n<ul>\n<li>niz sirovih vrsta<\/li>\n<li>polje neograni\u010denog zamjenskog znaka parametriziranog tipa<\/li>\n<li>zbirka umjesto niza<\/li>\n<\/ul>\n<p>Dok su nizovi konkretnih parametriziranih tipova nezakoniti, zbirke konkretnih parametriziranih tipova su dopu\u0161tene.<\/p>\n<p>Parametrizirani tip sa zamjenskim znakom je instancacija generi\u010dkog tipa gdje je barem jedan argument tipa zamjenski znak.\u00a0 Primjeri parametariziranih tipova sa zamjenskim znakovima su <tt> Kolekcija&lt;?&gt;<\/tt> , <tt> Popis&lt;? produ\u017eava Broj&gt;<\/tt> , <tt> Usporednik&lt;? super String&gt;<\/tt> i <tt> Par&lt;String,?&gt;<\/tt> . Parametrizirani tip sa zamjenskim znakovima ozna\u010dava obitelj tipova koja sadr\u017ei konkretne instancije generi\u010dkog tipa.\u00a0 Vrsta zamjenskog znaka koja se koristi odre\u0111uje koji konkretni parametrizirani tipovi pripadaju obitelji.\u00a0 Na primjer, tip s parametrima zamjenskih znakova <tt> Kolekcija&lt;?&gt;<\/tt> ozna\u010dava obitelj svih instancijacija <tt> Kolekcija<\/tt> su\u010delje bez obzira na argument tipa.\u00a0 Parametrizirani tip zamjenskog znaka <tt> Popis&lt;? produ\u017eava Broj&gt;<\/tt> ozna\u010dava obitelj svih tipova popisa gdje je tip elementa podtip\u00a0 <tt> Broj<\/tt> .\u00a0 Parametrizirani tip zamjenskog znaka <tt> Usporednik&lt;? super String&gt;<\/tt> je obitelj svih instancijacija <tt> Usporednik<\/tt> su\u010delje za tipove argumenata tipa koji su supertipovi <tt> Niz.<\/tt><\/p>\n<p><strong><em>Parametrizirani tip sa zamjenskim znakovima nije tip u uobi\u010dajenom smislu (razli\u010dit od neparametrizirane klase\/su\u010delja ili sirovog tipa).<\/em> <\/strong><\/p>\n<p>Parametrizirani tipovi zamjenskih znakova mogu se koristiti za tipkanje (poput neparametriziranih klasa i su\u010delja):<\/p>\n<ul>\n<li>kao argument i povratne vrste metoda<\/li>\n<li>kao tip polja ili lokalne referentne varijable<\/li>\n<li>kao tip komponente arrayas tipa argument drugih parametriziranih tipova<\/li>\n<li>kao ciljni tip u castovima<\/li>\n<\/ul>\n<p>Ne samo da tipovi mogu biti generi\u010dki, ve\u0107 i metode mogu biti generi\u010dke. Stati\u010dke i nestati\u010dke metode kao i konstruktori mogu imati parametre tipa. Sintaksa za deklaraciju parametara formalnog tipa sli\u010dna je sintaksi za generi\u010dke tipove. Odjeljak parametra tipa ome\u0111en je uglatim zagradama i pojavljuje se prije tipa povrata metode. Njegova sintaksa i zna\u010denje identi\u010dni su popisu parametara tipa generi\u010dkog tipa.<\/p>\n<p>Evo primjera generi\u010dkog lijeka <tt> max<\/tt> metoda koja izra\u010dunava najve\u0107u vrijednost u kolekciji elemenata nepoznatog tipa <tt> A<\/tt> .<\/p>\n<p>Primjer (generi\u010dke metode):<\/p>\n<blockquote><p><tt> klase Zbirke {<\/tt><br \/>\n<tt> \u00a0 javna stati\u010dnost <b> <span style=\"color:#000099;\"> &lt;A pro\u0161iruje Comparable&lt;A&gt;&gt; A<\/span> <\/b> max(Zbirka&lt;<b> <span style=\"color:#000099;\"> A<\/span> <\/b> &gt; xs) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 Iterator&lt;<b> <span style=\"color:#000099;\"> A<\/span> <\/b> &gt; xi = xs.iterator();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 <b> <span style=\"color:#000099;\"> A<\/span> <\/b> w = xi.sljede\u0107i();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 dok (xi.hasNext()) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#000099;\"> A<\/span> <\/b> x = xi.sljedeci();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 if (w.compareTo(x) &lt; 0) w = x;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 povratak w;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }\u00a0<\/tt><\/p><\/blockquote>\n<p>The <tt> max<\/tt> metoda ima jedan parametar tipa, named<tt> A<\/tt> .\u00a0 To je dr\u017ea\u010d mjesta za tip elementa zbirke na kojem metoda radi. Parametar tipa ima ograni\u010denje; to mora biti tip koji je podtip <tt> Usporedivo&lt;A&gt;<\/tt><\/p>\n<p>Primjer (istog generi\u010dkog tipa, ovaj put <i> s<\/i> granice):<\/p>\n<blockquote><p><tt> javno su\u010delje Comparable&lt;T&gt; {<\/tt><br \/>\n<tt> \u00a0 public int compareTo(T arg);<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> javna klasa TreeMap&lt;Key <b> <span style=\"color:#000066;\"> prote\u017ee Comparable&lt;Key&gt;<\/span> <\/b> ,Podaci&gt;{<\/tt><br \/>\n<tt> \u00a0 privatna stati\u010dka klasa Entry&lt;K,V&gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 K klju\u010d;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 V vrijednost;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Unos&lt;K,V&gt; lijevo = null;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Unos&lt;K,V&gt; desno = null;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Unos&lt;K,V&gt; roditelj;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 privatni prijelazni Entry&lt;Key,Data&gt; root = null;<\/tt><br \/>\n<tt> \u00a0 ...<\/tt><br \/>\n<tt> \u00a0 private Entry&lt;Key,Data&gt; getEntry(klju\u010d klju\u010da) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Entry&lt;Key,Data&gt; p = korijen;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Klju\u010d k = klju\u010d;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 dok (p != null) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int cmp = k.<b> <span style=\"color:#990000;\"> usporedi s(p.klju\u010d)<\/span> <\/b> ;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ako (cmp == 0)<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 povratak p;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ina\u010de ako (cmp &lt; 0)<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 p = p.lijevo;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 drugo\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 p = p. desno;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 vratiti null;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 public boolean containsKey(klju\u010d klju\u010da) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 return getEntry(key) != null;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>U gornjem primjeru, parametar tipa <tt> Klju\u010d<\/tt> ima obvezu <tt> Usporedivo&lt;Key&gt;<\/tt> .\u00a0 Specifikacija granice ima dva u\u010dinka:<\/p>\n<ul>\n<li><i> Omogu\u0107uje pristup metodama koje veza specificira<\/i> .\u00a0 U primjeru vezani <tt> Usporedivo&lt;Key&gt; <\/tt> daje pristup <tt> usporediti<\/tt> metoda koju \u017eelimo pozvati u implementaciji na\u0161eg <tt> TreeMap<\/tt> razreda.<\/li>\n<\/ul>\n<ul>\n<li><i> Samo tipovi &#8220;unutar granica&#8221; mogu se koristiti za instanciranje generi\u010dkog tipa.<\/i> \u00a0 U primjeru, parametrizirani tip kao \u0161to je <tt> TreeMap&lt;Broj, Niz&gt;<\/tt> bio bi odbijen, jer tip <tt> Broj<\/tt> nije podvrsta <tt> Usporediv&lt;Broj&gt;<\/tt> .\u00a0 Parametrizirani tip poput <tt> TreeMap&lt;String,String&gt;<\/tt> bi se prihvatilo, jer je tip String unutar granica, tj. podtip je <tt> Usporedivo&lt;String&gt;<\/tt> .<\/li>\n<\/ul>\n<p>Sve klase, su\u010delja i enum tipovi mogu se koristiti kao vezani za parametar tipa, uklju\u010duju\u0107i ugnije\u017e\u0111ene i unutarnje tipove.\u00a0 Niti primitivni tipovi niti tipovi polja ne mogu se koristiti kao vezani za parametar tipa.<\/p>\n<p>Primjeri (ograni\u010denja parametara tipa):<\/p>\n<blockquote><p><tt> klasa X0 &lt;T prote\u017ee <b> <span style=\"color:#000099;\"> int<\/span> <\/b> &gt; { ... }\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> klasa X1 &lt;T pro\u0161iruje <b> <span style=\"color:#000099;\"> Objekt[]<\/span> <\/b> &gt; { ... } <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> klasa X2 &lt;T pro\u0161iruje <b> <span style=\"color:#000099;\"> Broj<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> klasa X3 &lt;T produ\u017euje <b> <span style=\"color:#000099;\"> Niz<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> klasa X4 &lt;T produ\u017euje <b> <span style=\"color:#000099;\"> Pokretljiv<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> klasa X5 &lt;T produ\u017euje <b> <span style=\"color:#000099;\"> Nit.Stanje<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> klasa X6 &lt;T produ\u017euje <b> <span style=\"color:#000099;\"> Popis<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> klasa X7 &lt;T produ\u017euje <b> <span style=\"color:#000099;\"> Popis&lt;Niz&gt;<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> klasa X8 &lt;T produ\u017euje <b> <span style=\"color:#000099;\"> Popis&lt;? produ\u017eava Broj&gt;<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> klasa X9 &lt;T produ\u017euje <b> <span style=\"color:#000099;\"> Usporedivo&lt;? super broj&gt;<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> klasa X10&lt;T prote\u017ee se <b> <span style=\"color:#000099;\"> Map.Entry&lt;?,?&gt;<\/span> <\/b> &gt; { ... }<\/tt><\/p><\/blockquote>\n<p>Uzorak koda pokazuje da primitivni tipovi kao \u0161to su <tt> int<\/tt> i vrste nizova kao \u0161to su <tt> Objekt[] <\/tt> nisu dopu\u0161teni kao vezani za parametar tipa.<\/p>\n<p>Tipovi klasa, kao npr <tt> Broj<\/tt> ili <tt> Niz<\/tt> , i vrste su\u010delja, kao \u0161to je <tt> Pokretljiv<\/tt> , dopu\u0161teni su kao vezani za parametar tipa.<\/p>\n<p>Tipovi enuma, kao npr <tt> Nit.Stanje<\/tt> tako\u0111er su dopu\u0161teni kao vezani za parametar tipa. <tt> Nit.Stanje<\/tt> je primjer ugnije\u017e\u0111enog tipa koji se koristi kao veza parametra tipa.\u00a0 Dopu\u0161teni su i nestati\u010dni unutarnji tipovi.<\/p>\n<p>Neobra\u0111eni tipovi dopu\u0161teni su kao vezani za parametar tipa; <tt> <span style=\"color:#000000;\"> Popis<\/span> <\/tt> je primjer.<\/p>\n<p>Parametrizirani tipovi dopu\u0161teni su kao vezani za parametar tipa, uklju\u010duju\u0107i konkretne parametrizirane tipove kao \u0161to su <tt> Popis&lt;Niz&gt;<\/tt> , ograni\u010deni zamjenski znakovi parametrizirani tipovi kao \u0161to su <tt> Popis&lt;? produ\u017eava Broj&gt;<\/tt> i <tt> Usporedivo&lt;? super Long&gt;<\/tt> , i neograni\u010deni zamjenski znakovi parametrizirani tipovi kao \u0161to su <tt> Map.Entry&lt;?,?&gt;<\/tt> .\u00a0 Veza koja je parametarizirani tip sa zamjenskim znakom dopu\u0161ta kao argument tipa sve tipove koji pripadaju obitelji tipova koju ozna\u010dava zamjenski znak.\u00a0 Ograni\u010denje parametariziranog tipa sa zamjenskim znakom daje samo ograni\u010deni pristup poljima i metodama; ograni\u010denja ovise o vrsti zamjenskog znaka.<\/p>\n<p>Primjer (zamjenski znakovi parametriziranog tipa kao vezanog parametra tipa):<\/p>\n<blockquote><p><tt> klasa X&lt;<b> <span style=\"color:#000099;\"> T pro\u0161iruje List&lt;? produ\u017eava Broj&gt;<\/span> <\/b> &gt; {<\/tt><br \/>\n<tt> \u00a0 public void someMethod(T t) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 t.add(novo Dugo(0L));\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 Broj n = t.ukloni(0);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> klasa Test {<\/tt><br \/>\n<tt> \u00a0 public static void main(String[] args) {<\/tt><br \/>\n<tt> <b> <span style=\"color:#660000;\"> \u00a0\u00a0\u00a0\u00a0 <\/span> <\/b> <span style=\"color:#000000;\"> X&lt;ArrayList&lt;<\/span> <b> <span style=\"color:#000099;\"> dugo<\/span> <\/b> <span style=\"color:#000000;\"> &gt;&gt; x1 = novi X&lt;ArrayList&lt;Long&gt;&gt;();\u00a0<\/span> <\/tt><br \/>\n<tt> <span style=\"color:#000000;\"> \u00a0\u00a0\u00a0\u00a0 X&lt;ArrayList&lt;<\/span> <b> <span style=\"color:#000099;\"> Niz<\/span> <\/b> <span style=\"color:#000000;\"> &gt;&gt; x2 = novi X&lt;ArrayList&lt;String&gt;&gt;(); <\/span> <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Referentne varijable tipa<tt> T <\/tt> (parametar tipa) tretiraju se kao referentne varijable zamjenskog tipa (vezani parametar tipa).\u00a0 U na\u0161em primjeru posljedica je da prevodilac odbija pozivanje metoda koje uzimaju argument &#8220;nepoznatog&#8221; tipa za koji stoji parametar tipa, kao \u0161to je <tt> Nabrojati.dodati<\/tt> , jer je granica parametarizirani tip zamjenskog znaka s gornjom granicom.<br \/>\nUjedno i vezani <tt> Popis&lt;? produ\u017eava Broj&gt;<\/tt> odre\u0111uje tipove koji se mogu koristiti kao argumenti tipa. Prevodilac prihva\u0107a sve argumente tipa koji pripadaju obitelji tipa <tt> Popis&lt;? produ\u017eava Broj&gt;<\/tt> , odnosno sve podvrste <tt> Popis<\/tt> s argumentom tipa koji je podtip <tt> Broj<\/tt> .<\/p>\n<p>Parametar tipa mo\u017ee se koristiti kao granica drugog parametra tipa.<\/p>\n<p>Primjer (parametra tipa koji se koristi kao veza parametra tipa):<\/p>\n<blockquote><p><tt> klasa Triple<b> &lt;T&gt;<\/b> {<\/tt><br \/>\n<tt> \u00a0 privatni T fst, snd, trd;<\/tt><br \/>\n<tt> \u00a0 javni &lt;<b> U<\/b> <b> <span style=\"color:#000099;\"> produ\u017eava T<\/span> <\/b> , <b> V <span style=\"color:#000099;\"> produ\u017eava T<\/span> <\/b> , <b> W <span style=\"color:#000099;\"> produ\u017eava T<\/span> <\/b> &gt; Triple(U arg1, V arg2, W arg3) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 fst = arg1;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 snd = arg2;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 trd = arg3;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>U ovom primjeru parametar tipa <tt> T<\/tt> parametrizirane klase koristi se kao veza parametara tipa <tt> U<\/tt> ,\u00a0 <tt> V<\/tt> i <tt> W<\/tt> parametrizirane metode instance te klase.<\/p>\n<p>Daljnje prilike za kori\u0161tenje parametara tipa kao granica drugih parametara tipa uklju\u010duju situacije u kojima je ugnije\u017e\u0111eni tip definiran unutar generi\u010dkog tipa ili je lokalna klasa definirana unutar generi\u010dke metode.\u00a0 \u010cak je dopu\u0161teno koristiti parametar tipa kao vezu drugog parametra tipa u istom odjeljku parametra tipa.<\/p>\n<p>Veza koja je klasa daje pristup svim svojim javnim \u010dlanovima, to jest javnim poljima, metodama i ugnije\u017e\u0111enim tipovima. Samo konstruktori nisu dostupni, jer nema jamstva da podklasa vezane ima iste konstruktore kao i veza.<\/p>\n<p>Primjer (klase koja se koristi kao veza parametra tipa):<\/p>\n<blockquote><p><tt> javna klasa <span style=\"color:#000000;\"> Superklasa<\/span> {<\/tt><tt> \u00a0\u00a0\u00a0 \/\/ stati\u010dki \u010dlanovi<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 javna enum EnumType {THIS, THAT}<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 javni stati\u010dki objekt staticField;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public static void staticMethod() { ... }<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 \/\/ nestati\u010dki \u010dlanovi<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 javna klasa InnerClass { ... }<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 javni objekt nonStaticField;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public void nonStaticMethod() { ... }<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 \/\/ konstruktori<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public SuperClass() { ... }<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 \/\/ privatni \u010dlanovi<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 privatni objekt privateField;\u00a0<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p>\n<p><tt> public final class SomeClass&lt;T extends <b> <span style=\"color:#006600;\"> Superklasa<\/span> <\/b> &gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 privatni T objekt;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public SomeClass(T t) { object = t; }\u00a0<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 public String toString() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 povratak<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"stati\u010dki ugnije\u017e\u0111eni tip\u00a0\u00a0\u00a0 : \"+T.EnumType.class+\"\\n\"\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"stati\u010dno polje\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \"+T.staticField+\"\\n\"<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"stati\u010dka metoda\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \"+T.staticMethod()+\"\\n\"<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"nestati\u010dki ugnije\u017e\u0111eni tip: \"+T.InnerClass.class+\"\\n\"<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"nestati\u010dno polje\u00a0\u00a0\u00a0\u00a0\u00a0 : \"+object.nonStaticField+\"\\n\"<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"nestati\u010dna metoda\u00a0\u00a0\u00a0\u00a0 : \"+object.nonStaticMethod()+\"\\n\"<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"konstruktor\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \"+(novo T())+\"\\n\"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ pogre\u0161ka<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"privatni \u010dlan\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \"+object.privateField+\"\\n\"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ pogre\u0161ka\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Vezani <tt> Superklasa<\/tt> daje pristup svojim ugnije\u017e\u0111enim tipovima, stati\u010dkim poljima i metodama i nestati\u010dkim poljima i metodama.\u00a0 Samo konstruktor nije dostupan.\u00a0 To je zato \u0161to se konstruktori ne naslje\u0111uju. Svaka podklasa definira svoje vlastite konstruktore i ne mora podr\u017eavati konstruktore svoje superklase.\u00a0 Stoga nema jamstva da \u0107e podklasa od <tt> Superklasa<\/tt> imat \u0107e isti konstruktor kao i njegova superklasa.<\/p>\n<p>Kontekst u kojem<tt> Enum&lt;E pro\u0161iruje Enum&lt;E&gt;&gt;<\/tt> &#8221; \u010cini se da je deklaracija <tt> Enum<\/tt> klasa u paketu <tt> java.lang<\/tt> :<\/p>\n<blockquote><p><tt> javna apstraktna klasa <b> Enum&lt;E pro\u0161iruje Enum&lt;E&gt;&gt;<\/b> {<\/tt><br \/>\n<tt> \u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Vrsta <tt> Enum<\/tt> je zajedni\u010dka osnovna klasa svih tipova nabrajanja.\u00a0 U Javi tip enumeracije kao \u0161to je <tt> Boja<\/tt> se prevodi u klasu <tt> Boja<\/tt> koji se prote\u017ee <tt> Enum&lt;Boja&gt;<\/tt> . Svrha superklase <tt> Enum<\/tt> je pru\u017eiti funkcionalnost koja je zajedni\u010dka svim tipovima nabrajanja.<\/p>\n<p>Ovdje je skica klase <tt> Enum<\/tt> :<\/p>\n<blockquote><p><tt> javna apstraktna klasa <b> Enum&lt;<span style=\"color:#000099;\"> E<\/span> prote\u017ee Enum&lt;E&gt;&gt;<\/b> implementira Comparable&lt;<b> <span style=\"color:#000099;\"> E<\/span> <\/b> &gt;, Serializable {<\/tt><br \/>\n<tt> \u00a0 privatno kona\u010dno ime niza;<\/tt><br \/>\n<tt> \u00a0 public final String name() { ... }<\/tt><tt> \u00a0 privatni zavr\u0161ni int ordinal;<\/tt><br \/>\n<tt> \u00a0 public final int ordinal() { ... }<\/tt><\/p>\n<p><tt> \u00a0 za\u0161ti\u0107en Enum(naziv niza, int redni) { ... }<\/tt><\/p>\n<p><tt> \u00a0 javni niz\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 toString() { ... }<\/tt><br \/>\n<tt> \u00a0 public final boolean equals(Object other) { ... }<\/tt><br \/>\n<tt> \u00a0 public final int hashCode() { ... }<\/tt><br \/>\n<tt> \u00a0 za\u0161ti\u0107eni kona\u010dni Object clone() izbacuje CloneNotSupportedException { ... }<\/tt><br \/>\n<tt> \u00a0 public final int compareTo(<b> <span style=\"color:#000099;\"> E<\/span> <\/b> o) { ... }<\/tt><\/p>\n<p><tt> \u00a0 javna zavr\u0161na klasa&lt;<b> <span style=\"color:#000099;\"> E<\/span> <\/b> &gt; getDeclaringClass() { ... }<\/tt><br \/>\n<tt> \u00a0 public static &lt;T extends Enum&lt;T&gt;&gt; T valueOf(Class&lt;T&gt; enumType, String name) { ... }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Iznena\u0111uju\u0107a zna\u010dajka u deklaraciji &#8220;<tt> Enum&lt;E pro\u0161iruje Enum&lt;E&gt;&gt;<\/tt> &#8221; je \u010dinjenica da je novodefinirana klasa <tt> Enum<\/tt> i njegov novodefinirani parametar tipa <tt> E <\/tt> pojaviti u granicama tog istog tipa parametra.\u00a0 To zna\u010di da je <tt> Enum<\/tt> tip mora biti instanciran za jedan od svojih podtipova.\u00a0 Kako bismo razumjeli za\u0161to ovo ima smisla, uzmite u obzir da je svaki tip enuma preveden u podtip <tt> Enum<\/tt> .<\/p>\n<p>Ovdje je izmi\u0161ljen tip enuma <tt> Boja<\/tt> :<\/p>\n<blockquote><p><tt> nabrajanje <b> Boja<\/b> {CRVENA, PLAVA, ZELENA}<\/tt><\/p><\/blockquote>\n<p>Kompajler ga prevodi u sljede\u0107u klasu:<\/p>\n<blockquote><p><tt> javni zavr\u0161ni razred <b> Boja<\/b> prote\u017ee se <b> Enum&lt;Boja&gt;<\/b> {<\/tt><br \/>\n<tt> \u00a0 public static final Color[] values() { return (Color[])$VALUES.clone(); }<\/tt><br \/>\n<tt> \u00a0 public static Color valueOf(String name) { ... }<\/tt><tt> \u00a0 private Boja(String s, int i) { super(s, i); }<\/tt><\/p>\n<p><tt> \u00a0 javna stati\u010dna finalna boja CRVENA;<\/tt><br \/>\n<tt> \u00a0 javna stati\u010dna finalna boja PLAVA;<\/tt><br \/>\n<tt> \u00a0 javna stati\u010dna finalna boja ZELENA;<\/tt><\/p>\n<p><tt> \u00a0 privatna stati\u010dka kona\u010dna boja $VALUES[];<\/tt><\/p>\n<p><tt> \u00a0 stati\u010dki {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 RED = nova boja(\"RED\", 0);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 PLAVA = nova boja(\"PLAVA\", 1);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 ZELENO = nova boja(\"ZELENO\", 2);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 $VRIJEDNOSTI = (nova boja[] { CRVENA, PLAVA, ZELENA });<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Naslje\u0111e ima za posljedicu da <tt> Boja<\/tt> tip naslje\u0111uje sve metode implementirane u <tt> Enum&lt;Boja&gt;<\/tt> .\u00a0 Me\u0111u njima je i <tt> usporediti<\/tt> metoda.\u00a0 The <tt> Boja. usporediti<\/tt> metoda bi vjerojatno trebala uzeti a <tt> Boja<\/tt> kao argument.\u00a0 Kako bi se to dogodilo klas <tt> Enum<\/tt> je generi\u010dki i <tt> Enum.compareTo<\/tt> metoda uzima <tt> Enum<\/tt> parametar tipa <tt> E <\/tt> kao argument.\u00a0 Kao rezultat toga, tip <tt> Boja<\/tt> izvedeno iz <tt> Enum&lt;Boja&gt;<\/tt> naslje\u0111uje a <tt> usporediti<\/tt> metoda koja uzima a <tt> Boja<\/tt> kao i argument, to\u010dno kako treba.<br \/>\nAko ra\u0161\u010dlanimo deklaraciju &#8220;<tt> Enum&lt;E pro\u0161iruje Enum&lt;E&gt;&gt;<\/tt> &#8221; mo\u017eemo vidjeti da ovaj obrazac ima nekoliko aspekata.<\/p>\n<p>Prvo, postoji \u010dinjenica da je vezan parametar tipa sam tip: &#8220;<tt> <b> Enum<\/b> &lt;E se prote\u017ee <b> Enum<\/b> &lt;E&gt;&gt;<\/tt> &#8220;. Osigurava da samo podtipovi tipa <tt> Enum<\/tt> dopu\u0161teni su kao argumenti tipa. (Teoretski, tip <tt> Enum<\/tt> mo\u017ee se instancirati na sebi, kao u <tt> Enum&lt;Enum&gt;<\/tt> , ali to sigurno nije namjera i te\u0161ko je zamisliti situaciju u kojoj bi takva instancija bila korisna.)<\/p>\n<p>Drugo, postoji \u010dinjenica da je parametar vezan tip parametrizirani tip <tt> Enum<b> &lt;E&gt;<\/b> <\/tt> , koji koristi parametar tipa <tt> E<\/tt> kao argument tipa vezanog. Ova deklaracija osigurava da odnos naslje\u0111ivanja izme\u0111u podtipa i instancije <tt> Enum<\/tt> je oblika<tt> X pro\u0161iruje Enum&lt;X&gt;<\/tt> &#8220;. Podtip kao \u0161to je &#8220;<tt> X pro\u0161iruje Enum&lt;Y&gt;<\/tt> &#8221; ne mo\u017ee se deklarirati zbog argumenta tipa <tt> Y<\/tt> ne bi bilo unutar granica; samo podvrste <tt> Enum&lt;X&gt;<\/tt> su unutar granica.<\/p>\n<p>Tre\u0107e, postoji \u010dinjenica da <tt> Enum<\/tt> je generi\u010dki na prvom mjestu.\u00a0 To zna\u010di da neke od metoda klase <tt> Enum<\/tt> uzeti argument ili vratiti vrijednost nepoznatog tipa (ili na drugi na\u010din ovisiti o nepoznatom tipu). Kao \u0161to ve\u0107 znamo, ovaj nepoznati tip \u0107e kasnije biti podtip <tt> X<\/tt> od <tt> Enum&lt;X&gt;<\/tt> .\u00a0 Dakle, u parametriziranom tipu <tt> Enum&lt;X&gt;<\/tt> , ove metode uklju\u010duju podtip <tt> X<\/tt> , i oni se naslje\u0111uju u podtip <tt> X<\/tt> .\u00a0 The <tt> usporediti<\/tt> metoda je primjer takve metode; naslje\u0111uje se iz nadklase u svaku podklasu i u svakom slu\u010daju ima potpis specifi\u010dan za podklasu.<\/p>\n<p>Ukratko, deklaracija &#8220;<tt> Enum&lt;E pro\u0161iruje Enum&lt;E&gt;&gt;<\/tt> &#8221; se mo\u017ee de\u0161ifrirati kao: <tt> Enum<\/tt> je generi\u010dki tip koji se mo\u017ee instancirati samo za svoje podtipove, a ti podtipovi \u0107e naslijediti neke korisne metode, od kojih neke uzimaju argumente specifi\u010dne za podtip (ili na drugi na\u010din ovise o podtipu).<\/p>\n<p><b>Parametri tipa donje granice klasa<\/b><\/p>\n<p>Parametri tipa mogu imati nekoliko granica, kao u <tt> klasa Box&lt;T pro\u0161iruje Number&gt; {...}<\/tt> . Ali parametar tipa ne mo\u017ee imati donju granicu, to jest, konstrukcija kao \u0161to je <tt> klasa Box&lt;T <b> super<\/b> Broj&gt; {...}<\/tt> nije dopu\u0161teno.\u00a0 Za\u0161to ne?\u00a0 Odgovor je: besmisleno je jer vam ni\u0161ta ne bi kupilo da je dopu\u0161teno.\u00a0 Pogledajmo za\u0161to su parametri tipa donje granice klasa zbunjuju\u0107i istra\u017euju\u0107i \u0161to zna\u010di gornja granica parametra tipa.<\/p>\n<p>Gornja granica parametra tipa ima tri u\u010dinka:<\/p>\n<ol>\n<ol>\n<li><b> <i> Ograni\u010dena instancija.<\/i> <\/b> Gornja granica ograni\u010dava skup tipova koji se mogu koristiti za instanciranje generi\u010dkog tipa.\u00a0 Ako proglasimo a <tt> klasa Box&lt;T pro\u0161iruje Number&gt; {...} <\/tt> tada bi prevodilac osigurao da samo podtipovi od <tt> Broj<\/tt> mo\u017ee se koristiti kao argument tipa.\u00a0 Odnosno, a <tt> Kutija&lt;Broj&gt;<\/tt> ili a <tt> Kutija&lt;Long&gt;<\/tt> je dopu\u0161teno, ali a <tt> Kutija&lt;Objekt&gt;<\/tt> ili <tt> Kutija&lt;Niz&gt;<\/tt> bio bi odbijen<\/li>\n<\/ol>\n<\/ol>\n<p>Primjer (ograni\u010dene instancije zbog gornje granice parametra tipa):<br \/>\n<tt> klasa Box&lt;T extends Number&gt; {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 privatna T vrijednost;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public Box(T t) { value = t; }\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }\u00a0<\/tt><tt> klasa Test {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public static void main(String[] args) {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Box&lt;Long&gt; boxOfLong = novi Box&lt;Long&gt;(0L);\u00a0\u00a0 <b> \/\/ dobro<\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Box&lt;String&gt; boxOfString = novi Box&lt;String&gt;(\"\"); <b> <span style=\"color:#330000;\"> \/\/ pogre\u0161ka: String nije unutar granica<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p>\n<ol>\n<li><b> <i> Pristup nestati\u010dnim \u010dlanovima. <\/i> <\/b> Gornja granica daje pristup svim javnim nestati\u010dkim metodama i poljima gornje granice.\u00a0 U provedbi na\u0161eg <tt> klasa Box&lt;T pro\u0161iruje Number&gt; {...}<\/tt> mo\u017eemo pozvati sve javne nestati\u010dke metode definirane u klasi <tt> Broj<\/tt> , kao \u0161to je <tt> intValue()<\/tt> na primjer.\u00a0 Bez gornje granice prevodilac bi odbio svako takvo pozivanje. Primjer (pristupa nestati\u010dkim \u010dlanovima zbog gornje granice parametra tipa):<\/li>\n<\/ol>\n<p><tt> klasa Box&lt;T extends Number&gt; {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 privatna T vrijednost;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public Box(T t) { value = t; }\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public int increment() { return value.intValue()+1; } <b> \/\/ &lt;= bila bi pogre\u0161ka bez vezanog broja<\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }\u00a0<\/tt><\/p>\n<ol>\n<ol>\n<li><b> <i> Tip Brisanje. <\/i> <\/b> Krajnja lijeva gornja granica koristi se za brisanje tipa i zamjenjuje parametar tipa u bajt kodu.\u00a0 U na\u0161em <tt> klasa Box&lt;T pro\u0161iruje Number&gt; {...}<\/tt> sve pojave <tt> T<\/tt> bila bi zamijenjena gornjom granicom <tt> Broj<\/tt> .\u00a0 Na primjer, ako klasa <tt> Kutija<\/tt> ima privatno polje tipa <tt> T<\/tt> i metoda <tt> void skup (T sadr\u017eaj) <\/tt> za postavljanje ovog privatnog polja, tada bi polje bilo vrste <tt> Broj<\/tt> nakon brisanja tipa i metoda bi se prevela u metodu <tt> skup praznina (sadr\u017eaj broja)<\/tt> .<\/li>\n<\/ol>\n<\/ol>\n<p>Primjer (upotrebe gornje granice parametra tipa u brisanju tipa &#8211; <i> prije<\/i> brisanje tipa):<br \/>\n<tt> klasa Box&lt;<b> T pro\u0161iruje broj<\/b> &gt; {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 privatni <b> T<\/b> vrijednost;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 javna kutija (<b> T<\/b> t) { vrijednost = t; }\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }\u00a0<\/tt><\/p>\n<ol>\n<ol>Primjer (upotrebe gornje granice parametra tipa u brisanju tipa &#8211;<\/ol>\n<\/ol>\n<p><i> nakon<\/i><\/p>\n<ol>\n<ol>brisanje tipa):<\/ol>\n<\/ol>\n<p>&nbsp;<\/p>\n<p><tt> klasa Box {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 privatni <b> Broj<\/b> vrijednost;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 javna kutija (<b> Broj<\/b> t) { vrijednost = t; }\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p>\n<ol>Osim toga, krajnja lijeva gornja granica pojavljuje se na daljnjim mjestima, kao \u0161to su automatski umetnuti odljevi i metode mosta.<\/ol>\n<p>Da su ni\u017ee granice dopu\u0161tene za parametre tipa, koje bi nuspojave imale ili trebale imati? Ako konstrukt kao \u0161to je <tt> klasa Box&lt;T <b> super<\/b> Broj&gt; {...} <\/tt> bili dopu\u0161teni, \u0161to bi to zna\u010dilo?\u00a0 \u0160to bi 3 nuspojave gornje granice parametra tipa &#8211; ograni\u010dena instancija, pristup nestati\u010dkom \u010dlanu, brisanje tipa &#8211; zna\u010dile za donju granicu?<\/p>\n<p><i> Ograni\u010dene instance. <\/i> Prevodilac mo\u017ee ograni\u010diti skup tipova koji se mogu koristiti za instanciranje generi\u010dkog tipa s parametrom tipa donje granice.\u00a0 Na primjer, kompajler mo\u017ee dopustiti instanciranje kao \u0161to je <tt> Kutija&lt;Broj&gt;<\/tt> i <tt> Kutija&lt;Objekt&gt;<\/tt> od a <tt> Kutija&lt;T <b> super<\/b> Broj&gt; <\/tt> i odbaciti instancije kao \u0161to su <tt> Kutija&lt;Long&gt;<\/tt> ili <tt> Kutija&lt;Kratka&gt;<\/tt> .\u00a0 To bi bio u\u010dinak u skladu s restriktivnim nuspojavama opisanim za gornje granice parametara tipa.<\/p>\n<p><i> Pristup nestati\u010dnim \u010dlanovima. <\/i> Ni\u017ea granica parametra tipa ne daje pristup nijednoj odre\u0111enoj metodi osim onih naslije\u0111enih iz klase <tt> Objekt<\/tt> . U primjeru <tt> Kutija&lt;T <b> super<\/b> Broj&gt; <\/tt> nadtipovi od <tt> Broj<\/tt> nemaju ni\u0161ta zajedni\u010dko, osim \u0161to su referentni tipovi i stoga podtipovi <tt> Objekt<\/tt> .\u00a0 Prevodilac ne mo\u017ee pretpostaviti da polje tipa <tt> T<\/tt> je tipa <tt> Broj<\/tt> ili njegov podtip.\u00a0 Umjesto toga, polje tipa <tt> T<\/tt> mo\u017ee biti bilo kojeg supertipa <tt> Broj<\/tt> , kao \u0161to je <tt> Serializable<\/tt> ili <tt> Objekt<\/tt> .\u00a0 Pozivanje metode kao \u0161to je <tt> intValue()<\/tt> vi\u0161e nije siguran za tip i kompajler bi ga morao odbaciti. Kao posljedica toga, donja granica parametra tipa ne bi dala pristup nestati\u010dkim \u010dlanovima izvan onih definiranih u klasi <tt> Objekt<\/tt> i stoga ima isti u\u010dinak kao &#8220;no bound&#8221;.<\/p>\n<p><i> Tip Brisanje<\/i> .\u00a0 Slijede\u0107i ovu logiku, nema smisla zamijeniti pojavljivanja parametra tipa njegovom krajnjom lijevom donjom granicom.\u00a0 Deklariranje metode poput konstruktora <tt> kutija(<b> T<\/b> t) <\/tt> kao konstruktor <tt> kutija(<b> Broj<\/b> t)<\/tt> nema smisla, s obzirom na to <tt> T<\/tt> zamjenjuje se nadtipom od <tt> Broj<\/tt> .\u00a0 An <tt> Objekt<\/tt> mo\u017ee se ispravno proslijediti konstruktoru u instanci <tt> Kutija&lt;Objekt&gt;<\/tt> a konstruktor bi ga odbio.\u00a0 Ovo bi bilo potpuno pogre\u0161no.\u00a0\u00a0 Dakle, brisanje tipa bi zamijenilo sva pojavljivanja varijable tipa<tt> T<\/tt> prema vrsti <tt> Objekt<\/tt> , a ne svojom donjom granicom.\u00a0 Opet, donja granica bi imala isti u\u010dinak kao &#8220;bez granice&#8221;.<\/p>\n<p>\u017delite li shvatiti \u0161to bi zna\u010dilo da su oba ni\u017ea <i> _i_<\/i> gornje granice su bile dopu\u0161tene?\u00a0\u00a0 Osobno, ne \u017eelim ni razmi\u0161ljati o tome i radije bih to zaveo pod &#8220;neupravljivo&#8221;, ako dopu\u0161tate.<\/p>\n<p>Su\u0161tina je: sve to &#8220;<tt> super<\/tt> &#8220;vezan bi vas kupio je ograni\u010denje koje samo nadtipovi <tt> Broj<\/tt> mogu se koristiti kao argumenti tipa.\u00a0 A i to se \u010desto krivo shva\u0107a.\u00a0 To NE bi zna\u010dilo to <tt> razred Box&lt;T super Number&gt; {...}<\/tt> sadr\u017ei samo instance supertipova <tt> Broj<\/tt> .\u00a0 Upravo obrnuto &#8211; kao \u0161to pokazuje primjer u nastavku!<\/p>\n<p>Primjer (upotrebe gornje granice parametra tipa u brisanju tipa &#8211; <i> prije<\/i> brisanje tipa):<\/p>\n<div style=\"margin-left:40px;\">\n<blockquote><p><tt> klasa Box&lt;<b> T super broj<\/b> &gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0 privatni <b> T<\/b> vrijednost;<\/tt><br \/>\n<tt> \u00a0\u00a0 javna kutija (<b> T<\/b> t) { vrijednost = t; }<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<\/div>\n<p>Primjer (upotrebe gornje granice parametra tipa u brisanju tipa &#8211; <i> nakon<\/i> brisanje tipa):<\/p>\n<div style=\"margin-left:40px;\">\n<blockquote><p><tt> klasa Box {<\/tt><br \/>\n<tt> \u00a0\u00a0 privatni <b> Objekt<\/b> vrijednost;<\/tt><br \/>\n<tt> \u00a0\u00a0 javna kutija (<b> Objekt<\/b> t) { vrijednost = t; }<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<\/div>\n<p>A <tt> klasa Box&lt;T <b> super<\/b> Broj&gt; {...} <\/tt> bilo bi prevedeno brisanjem tipa u a <tt> Kutija<\/tt> koji sadr\u017ei <tt> Objekt<\/tt> polje i njegov konstruktor bili bi prevedeni na <tt> Kutija (objekt t)<\/tt> . To se bitno razlikuje od a <tt> klasa Box&lt;T <b> prote\u017ee se<\/b> Broj&gt; {...}<\/tt> , \u0161to bi u prijevodu bilo a <tt> Kutija<\/tt> koji sadr\u017ei a <tt> Broj<\/tt> polje i njegov konstruktor bili bi prevedeni na <tt> Kutija (broj t)<\/tt> . Posljedi\u010dno, a <tt> Kutija&lt;Broj&gt;<\/tt> instancirano iz a<tt> klasa Box&lt;T pro\u0161iruje Number&gt; {...}<\/tt> bilo bi druga\u010dije od a <tt> Kutija&lt;Broj&gt;<\/tt> instancija iz a <tt> razred Box&lt;T super Number&gt; {...}<\/tt> , \u0161to \u0107e vjerojatno izazvati zabunu.\u00a0 Iz tog razloga donje granice nemaju smisla za parametre tipa klasa.<\/p>\n<p>&nbsp;<\/p>\n<hr width=\"100%\" \/>\n<p>&nbsp;<\/p>\n<p><b>Parametri tipa donje granice metoda<\/b><\/p>\n<p>U kombinaciji s metodama i njihovim tipovima argumenata, parametar tipa s donjom granicom povremeno mo\u017ee biti koristan.<\/p>\n<p>Primjer (metode koja bi imala koristi od parametra tipa s donjom granicom):<\/p>\n<blockquote><p><tt> klasa Pair&lt;X,Y&gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0 privatni X prvi;<\/tt><br \/>\n<tt> \u00a0\u00a0 privatni Y drugi;<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> \u00a0\u00a0 javni &lt;<b> Super X<\/b> ,<b> B super Y<\/b> &gt; B addToMap(Map&lt;A,B&gt; map) { \/\/ pogre\u0161ka: parametar tipa ne mo\u017ee imati donju granicu<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 return map.put(prvi, drugi);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> klasa Test {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public static void main(String[] args) {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Par&lt;String,Long&gt; par = novi Par&lt;&gt;(\"ABC\",42L);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Map&lt;CharSequence, Number&gt; map = HashMap&lt;CharSequence, Number&gt;();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Broj broj = pair.addToMap(map);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>The <tt> addToMap()<\/tt> metoda dodaje sadr\u017eaj para na kartu.\u00a0 Svaka karta koja mo\u017ee sadr\u017eavati supertipove <tt> X<\/tt> i <tt> Y<\/tt> bi u\u010dinio.\u00a0 Karta je <tt> staviti()<\/tt> metoda vra\u0107a vrijednost prona\u0111enu u mapi za dati klju\u010d, ako ve\u0107 postoji unos klju\u010d-vrijednost za klju\u010d u mapi.\u00a0 Povratna vrijednost karte <tt> staviti()<\/tt> metoda se vra\u0107a iz <tt> addToMap()<\/tt> metoda.\u00a0 Pod ovim okolnostima \u017eeljeli bismo deklarirati metodu kao \u0161to je prikazano gore: Mapa je parametrizirana supertipovima parametara tipa para i <tt> addToMap()<\/tt> povratni tip metode je tip vrijednosti mape.<\/p>\n<p>Since the compiler does not allow lower bounds on type parameters we need a work-around.<\/p>\n<p>One work-around that comes to mind is the use of a wildcard, because wildcards can have a lower bound.\u00a0 Ovdje je zaobilazno kori\u0161tenje zamjenskog znaka.<\/p>\n<p>Example (of a work-around for the previous example using wildcards):<\/p>\n<blockquote><p><tt> klasa Pair&lt;X,Y&gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0 privatni X prvi;<\/tt><br \/>\n<tt> \u00a0\u00a0 privatni Y drugi;<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> \u00a0\u00a0 javnost <b> Objekt<\/b> addToMap(Map&lt;<b> ? Super X<\/b> , <b> ? super Y<\/b> &gt; karta) {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 return map.put(prvi, drugi);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> klasa Test {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public static void main(String[] args) {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Par&lt;String,Long&gt; par = novi Par&lt;&gt;(\"ABC\",42L);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Map&lt;CharSequence, Number&gt; map = HashMap&lt;CharSequence, Number&gt;();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Broj broj = <b> (Broj)<\/b> pair.addToMap(mapa);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>It works, except that there is no way to declare the return type as desired.\u00a0 Bio bi to supertip <tt> Y<\/tt> that the compiler captures from the map type, but there is no syntax for specifying it.\u00a0 Ne smijemo proglasiti vrstu povrata &#8220;<tt> ? super Y<\/tt> &#8220;, jer&#8221;<tt> ? super Y<\/tt> &#8221; je zamjenski znak, a\u00a0 ne vrsta i stoga nije dopu\u0161ten kao vrsta povrata. Nemamo izbora i moramo koristiti <tt> Objekt<\/tt> umjesto kao tip povrata na\u0161e metode.\u00a0 This rather unspecific return type in turn forces callers of the <tt> addToMap()<\/tt> metoda u pretvaranje povratne vrijednosti <tt> Objekt<\/tt> na njegovu stvarnu vrstu.\u00a0 Ovo nije ba\u0161 ono \u0161to smo imali na umu.<\/p>\n<p>Drugo rje\u0161enje je kori\u0161tenje stati\u010dkih metoda.\u00a0 Here is a work-around with a static instead of a non-static method.<\/p>\n<p>Example (of a work-around for the previous example using a static method):<\/p>\n<blockquote><p><tt> klasa Pair&lt;X,Y&gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0 privatni X prvi;<\/tt><br \/>\n<tt> \u00a0\u00a0 privatni Y drugi;<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> \u00a0\u00a0 javnost <b> stati\u010dki<\/b> &lt;<b> A<\/b> ,<b> B<\/b> ,X <b> produ\u017eava A<\/b> ,Y <b> produ\u017eava B<\/b> &gt; B addToMap(par&lt;X,Y&gt; par, karta&lt;<b> A<\/b> ,<b> B<\/b> &gt; karta) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 return map.put(par.prvi,par.drugi);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> klasa Test {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public static void main(String[] args) {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Par&lt;String,Long&gt; par = novi Par&lt;&gt;(\"ABC\",42L);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Map&lt;CharSequence, Number&gt; map = HashMap&lt;CharSequence, Number&gt;();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Broj broj = <b> Par<\/b> .addToMap(<b> par<\/b> ,karta);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Generi\u010dki <tt> addToMap()<\/tt> metoda ima \u010detiri parametra tipa: dva rezervirana mjesta <tt> X<\/tt> i <tt> Y<\/tt> za tip para i dva rezervirana mjesta <tt> A<\/tt> i <tt> B <\/tt> za vrstu karte. <tt> A<\/tt> i <tt> B<\/tt> su supertipovi <tt> X<\/tt> i <tt> Y<\/tt> , jer <tt> X<\/tt> i <tt> Y<\/tt> \u00a0 deklariraju se s <tt> A<\/tt> i <tt> B<\/tt> kao njihove gornje granice. (Imajte na umu da su parametri tipa generi\u010dke metode <tt> X<\/tt> i <tt> Y<\/tt> nemaju nikakve veze s <tt> Par<\/tt> klase <tt> X<\/tt> i <tt> Y<\/tt> parametri.\u00a0 Imena <tt> X<\/tt> i <tt> Y<\/tt> ponovno se koriste za generi\u010dku metodu kako bi ih se lako prepoznalo kao parametre tipa para.)\u00a0 Pomo\u0107u \u010detiri parametra tipa mo\u017eemo deklarirati preciznu vrstu povrata po \u017eelji: ista je vrsta kao i vrsta vrijednosti karte.<\/p>\n<p>Primjer (nezakonite uporabe parametra tipa u stati\u010dkom kontekstu generi\u010dke klase):<\/p>\n<blockquote><p><tt> klasa SomeClass<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> stati\u010dki inicijalizator, stati\u010dko polje, stati\u010dka metoda<\/i><br \/>\n<tt> \u00a0 <b> stati\u010dki<\/b> {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 Neka klasa&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> &gt; test = novi SomeClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> &gt;(); <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 privatni <b> stati\u010dki<\/b> <b> <span style=\"color:#000099;\"> T<\/span> <\/b> globalInfo;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 javnost\u00a0 <b> stati\u010dki<\/b> <b> <span style=\"color:#000099;\"> T <\/span> <\/b> getGlobalInfo() {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 vratiti globalInfo;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> nestati\u010dki inicijalizator, nestati\u010dko polje, nestati\u010dka metoda<\/i><br \/>\n<tt> \u00a0 {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 Neka klasa&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> &gt; test = novi SomeClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> &gt;();<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 privatni\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#000099;\"> T<\/span> <\/b> localInfo;<\/tt><br \/>\n<tt> \u00a0 javnost\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getLocalInfo() {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 return localInfo;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> stati\u010dki ugnije\u017e\u0111eni tipovi<\/i><br \/>\n<tt> \u00a0 javnost <b> stati\u010dki<\/b> <b> razreda<\/b> Neuspjeh pro\u0161iruje iznimku {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 privatno finale <b> <span style=\"color:#000099;\"> T<\/span> <\/b> info;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 javni neuspjeh (<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) { info = t; }\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 javnost <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getInfo() { return info; }\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 privatni <b> su\u010delje<\/b> Mo\u017ee se kopirati {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 <b> <span style=\"color:#000099;\"> T<\/span> <\/b> kopirati();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 privatni <b> nabrajanje<\/b> Dr\u017eava {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 VALJAN, NEVALJAN;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 privatni <b> <span style=\"color:#000099;\"> T<\/span> <\/b> info; \/\/ pogre\u0161ka<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public void setInfo(<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) { info = t; } <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 javnost <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getInfo() { return info; }\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> nestati\u010dki ugnije\u017e\u0111eni tipovi<\/i><br \/>\n<tt> \u00a0 javnost <b> razreda<\/b> Pristupnik {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 javnost <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getInfo() { return localInfo; }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Primjer ilustrira da se parametar tipa ne mo\u017ee koristiti u stati\u010dkom kontekstu generi\u010dke klase.\u00a0 Tako\u0111er pokazuje da se ugnije\u017e\u0111ena su\u010delja i enum tipovi smatraju \u010dlanovima stati\u010dnog tipa klase.\u00a0 Samo unutarnje klase, to jest nestati\u010dke ugnije\u017e\u0111ene klase, mogu koristiti parametar tipa prilo\u017eene generi\u010dke klase.<\/p>\n<p>Opseg parametra tipa su\u010delja cijela je definicija su\u010delja, osim svih polja ili ugnije\u017e\u0111enih tipova.\u00a0 To je zato \u0161to su polja i ugnije\u017e\u0111eni tipovi definirani u su\u010delju implicitno stati\u010dni.<\/p>\n<p>Primjer (nezakonite upotrebe parametra tipa u generi\u010dkom su\u010delju):<\/p>\n<blockquote><p><tt> su\u010delje SomeInterface<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> polje<\/i><br \/>\n<tt> \u00a0 Neka klasa&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> &gt; vrijednost = novi SomeClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> &gt;();\u00a0 <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> ugnije\u017e\u0111eni tip<\/i><br \/>\n<tt> \u00a0 <b> razreda<\/b> Pristupnik {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 javnost <b> <span style=\"color:#000099;\"> T <\/span> <\/b> getInfo() {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ pogre\u0161ka<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 povratna vrijednost.getGlobalInfo();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> metode<\/i><br \/>\n<tt> \u00a0 <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getValue();<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Primjer pokazuje da su polja su\u010delja implicitno stati\u010dna, tako da se parametar tipa ne mo\u017ee koristiti bilo gdje u deklaraciji polja generi\u010dkog su\u010delja.\u00a0 Sli\u010dno, ugnije\u017e\u0111ena klasa smatra se stati\u010dkom ugnije\u017e\u0111enom klasom, a ne unutarnjom klasom, i iz tog razloga upotreba parametra tipa bilo gdje u ugnije\u017e\u0111enoj klasi je nezakonita.<\/p>\n<p><b> <i> Zaobilazno rje\u0161enje za ugnije\u017e\u0111ene stati\u010dke klase i su\u010delja:<\/i> <\/b><\/p>\n<p>U slu\u010daju stati\u010dkih ugnije\u017e\u0111enih klasa i su\u010delja to nije velika nevolja.\u00a0 Kao zaobilazno rje\u0161enje mo\u017eemo generirati samu stati\u010dku klasu ili su\u010delje.<\/p>\n<p>Primjer (zaobilazno rje\u0161enje &#8211; generirajte ugnije\u017e\u0111eni stati\u010dki tip):<\/p>\n<blockquote><p><tt> klasa Wrapper<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 privatno finale <b> <span style=\"color:#000099;\"> T<\/span> <\/b> theObject;<\/tt><\/p><\/blockquote>\n<blockquote><p><tt> \u00a0 javni omota\u010d(<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) { theObject = t; }<\/tt><br \/>\n<tt> \u00a0 javnost <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getWrapper() { return theObject; }<\/tt><tt> \u00a0 javni Nepromjenjivi<b> &lt;T&gt;<\/b> makeImmutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vratiti novi nepromjenjivi<b> &lt;T&gt;<\/b> (objekt);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 javni promjenjivi<b> &lt;T&gt;<\/b> makeMutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vrati novi promjenjivi<b> &lt;T&gt;<\/b> (objekt);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 privatni stati\u010dki &lt;A&gt; A makeClone(A theObject) { ... }<\/tt><\/p>\n<p><tt> \u00a0 javna stati\u010dka finalna klasa nepromjenljiva<b> &lt;A&gt;<\/b> { <b> \/\/ sada je generi\u010dka klasa<\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 privatno finale <b> A<\/b> theObject;<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 javno nepromjenjivo(<b> A<\/b> arg) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 theObject = makeClone(arg);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 javnost <b> A<\/b> getWrappedItem() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return makeClone(theObject);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 javna stati\u010dka klasa Promjenjiva<b> &lt;A&gt;<\/b> {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ... sli\u010dno ...<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Ne postoji takvo rje\u0161enje za ugnije\u017e\u0111ene enum tipove jer oni ne mogu biti generi\u010dki.<\/p>\n<p><b> <i> Zaobilazno rje\u0161enje za ugnije\u017e\u0111ene stati\u010dke klase:<\/i> <\/b><\/p>\n<p>Ako je ugnije\u017e\u0111eni stati\u010dki tip klasa, alternativno rje\u0161enje bilo bi pretvaranje stati\u010dke klase u nestati\u010dnu unutarnju klasu.<\/p>\n<p>Primjer (zaobilazno rje\u0161enje &#8211; koristite unutarnju klasu):<\/p>\n<blockquote><p><tt> klasa Wrapper<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 privatno finale <b> <span style=\"color:#000099;\"> T<\/span> <\/b> theObject;<\/tt><\/p><\/blockquote>\n<blockquote><p><tt> \u00a0 javni omota\u010d(<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) { theObject = t; }<\/tt><br \/>\n<tt> \u00a0 javnost <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getWrapper() { return theObject; }<\/tt><tt> \u00a0 public Mutable makeMutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 povratak <b> ovaj.<\/b> novi promjenjivi(theObject);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 public nepromjenjiv makeImmutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 povratak <b> ovaj.<\/b> novi nepromjenjivi(theObject);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 privatni stati\u010dki &lt;A&gt; A makeClone(A theObject) { ... }<\/tt><\/p>\n<p><tt> \u00a0 javna zavr\u0161na klasa nepromjenjiva {\u00a0 <b> \/\/ vi\u0161e nije stati\u010dna klasa<\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 privatno finale <b> T<\/b> theObject;<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0\u00a0\u00a0 javno nepromjenjivo(<b> T<\/b> arg) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 theObject = makeClone(arg);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 javnost <b> T<\/b> getWrappedItem() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return makeClone(theObject);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 javna klasa Promjenjiv\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ... sli\u010dno ...<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Ovo zaobilazno rje\u0161enje dolazi s odre\u0111enim optere\u0107enjem jer sve unutarnje klase imaju skrivenu referencu na instancu vanjskog tipa, \u0161to u ovom primjeru niti trebaju niti iskori\u0161tavaju; skrivena referenca je samo prtljaga.\u00a0 \u010cesto se unutarnje klase kombiniraju sa su\u010deljima kako bi unutarnja klasa ostala privatnim implementacijskim detaljem klase koja je obuhva\u0107a.\u00a0 I mi mo\u017eemo u\u010diniti isto ovdje.<\/p>\n<p>Primjer (prethodno zaobilazno rje\u0161enje pro\u010di\u0161\u0107eno):<\/p>\n<blockquote><p><tt> klasa Wrapper<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 privatno finale <b> <span style=\"color:#000099;\"> T<\/span> <\/b> theObject;<\/tt><\/p><\/blockquote>\n<blockquote><p><tt> \u00a0 javni omota\u010d(<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) { theObject = t; }<\/tt><br \/>\n<tt> \u00a0 javnost <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getWrapper() { return theObject; }<\/tt><tt> \u00a0 javni promjenjivi<b> &lt;T&gt;<\/b> makeMutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 return this.new Mutable(theObject);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 javni Nepromjenjivi<b> &lt;T&gt;<\/b> makeImmutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 return this.new Immutable(theObject);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 privatni stati\u010dki &lt;A&gt; A makeClone(A theObject) { ... }<\/tt><\/p>\n<p><tt> \u00a0 <b> javno su\u010delje <\/b> Nepromjenjiv&lt;S&gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 S getWrappedItem();<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 <b> javno su\u010delje <\/b> Promjenjiv&lt;S&gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 S getWrappedItem();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 void setWrappedItem(S arg);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 <b> privatni<\/b> final class ImmutableImplementation <b> implementira nepromjenjiv&lt;T&gt;<\/b> {\u00a0<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0\u00a0\u00a0 privatni kona\u010dni T theObject;<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0\u00a0\u00a0 public ImmutableImplementation(T arg) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 theObject = makeClone(arg);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 public T getWrappedItem() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return makeClone(theObject);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 <b> privatni<\/b> klasa Promjenjiva Implementacija <b> implementira Mutable&lt;T&gt;<\/b> {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ... sli\u010dno ...<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Kao \u0161to vidite, ugnije\u017e\u0111ena javna su\u010delja moraju biti generi\u010dka, dok unutarnje privatne klase mogu koristiti parametar tipa klase koja ih okru\u017euje.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<table width=\"100%\" cellpadding=\"10\">\n<tbody>\n<tr valign=\"TOP\">\n<td colspan=\"2\" width=\"68%\"><b>\u00a0<\/b><\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Za vi\u0161e informacija pogledajte ovaj FAQ: <a href=\"http:\/\/www.angelikalanger.com\/GenericsFAQ\/JavaGenericsFAQ.html#SECTION1\" rel=\"nofollow\">http:\/\/www.angelikalanger.com\/GenericsFAQ\/JavaGenericsFAQ.html#SECTION1<\/a> Evo nekoliko va\u017enih to\u010daka iz ovog FAQ-a. Primjer (generi\u010dki tip): class Pair&lt;X,Y&gt; { private X prvi; \u00a0 privatni Y drugi; \u00a0 public par(X a1, Y a2) { \u00a0\u00a0\u00a0 prvi = a1; \u00a0\u00a0\u00a0 drugi = a2; \u00a0 } \u00a0 public X getFirst() { return prvi; } \u00a0 [&hellip;]<\/p>\n","protected":false},"author":65283547,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"Generics in short form","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1017],"tags":[18369,2549795,6280762],"class_list":["post-31","post","type-post","status-publish","format-standard","hentry","category-java","tag-generici","tag-java","tag-java-generici"],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4CoHV-v","jetpack-related-posts":[{"id":2532,"url":"https:\/\/vkrastev1blog.com\/2026\/10\/02\/%d0%b2%d1%82%d0%be%d1%80%d0%b8%d1%8f%d1%82-%d0%b2%d1%81%d0%b5%d0%bb%d0%b5%d0%bd%d1%81%d0%ba%d0%b8-%d1%81%d1%8a%d0%b1%d0%be%d1%80-%d0%b2-%d0%ba%d0%be%d0%bd%d1%81%d1%82%d0%b0%d0%bd%d1%82%d0%b8%d0%bd\/","url_meta":{"origin":31,"position":0},"title":"Drugi ekumenski sabor u Carigradu (381.) - potvrda nauka o Duhu Svetome","author":"vkrastev2014","date":"02.10.2026","format":false,"excerpt":"\u0412\u0442\u043e\u0440\u0438\u044f\u0442 \u0432\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u0438 \u0441\u044a\u0431\u043e\u0440 \u0432 \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0438\u043d\u043e\u043f\u043e\u043b (381 \u0433.) \u2013 \u0443\u0442\u0432\u044a\u0440\u0436\u0434\u0430\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0443\u0447\u0435\u043d\u0438\u0435\u0442\u043e \u0437\u0430 \u0421\u0432\u0435\u0442\u0438\u044f \u0414\u0443\u0445 \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0430 \u0445\u0440\u0438\u0441\u0442\u0438\u044f\u043d\u0441\u0442\u0432\u043e\u0442\u043e \u2022 \u0412\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u0438 \u0441\u044a\u0431\u043e\u0440\u0438 \u2022 IV \u0432\u0435\u043a \u0412\u0442\u043e\u0440\u0438\u044f\u0442 \u0432\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u0438 \u0441\u044a\u0431\u043e\u0440, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0435\u0437 381 \u0433. \u0432 \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0438\u043d\u043e\u043f\u043e\u043b, \u0435 \u0435\u0434\u043d\u043e \u043e\u0442 \u043d\u0430\u0439-\u0432\u0430\u0436\u043d\u0438\u0442\u0435 \u0441\u044a\u0431\u0438\u0442\u0438\u044f \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044f\u0442\u0430 \u043d\u0430 \u0440\u0430\u043d\u043d\u043e\u0442\u043e \u0445\u0440\u0438\u0441\u0442\u0438\u044f\u043d\u0441\u0442\u0432\u043e. \u041d\u0430 \u043d\u0435\u0433\u043e \u0435 \u043f\u043e\u0442\u0432\u044a\u0440\u0434\u0435\u043d\u0430 \u041d\u0438\u043a\u0435\u0439\u0441\u043a\u0430\u0442\u0430 \u0432\u044f\u0440\u0430 \u043e\u0442 325\u2026","rel":"","context":"In &quot;\u010clanci posve\u0107eni Bibliji te o duhu i tijelu&quot;","block_context":{"text":"\u010clanci posve\u0107eni Bibliji te o duhu i tijelu","link":"https:\/\/vkrastev1blog.com\/category\/%d1%81%d1%82%d0%b0%d1%82%d0%b8%d0%b8-%d0%bf%d0%be%d1%81%d0%b2%d0%b5%d1%82%d0%b5%d0%bd%d0%b8-%d0%bd%d0%b0-%d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d1%8f%d1%82%d0%b0-%d0%b8-%d0%b7%d0%b0-%d0%b4%d1%83%d1%85%d0%b0\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/ebtppy-v5hhqxqbousaxhde8pmrm8ky9vg5zhq_i42gf-itvech_wr25ui-u_ruov2gkqenknbbx2y7ekwwxzt8559wmlq424iif_pbcon6riek_ttdbxwp75aulyh3_naxhvg_pukcmdvjs88b30esv3xgtigs1gsziujd02gs.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/ebtppy-v5hhqxqbousaxhde8pmrm8ky9vg5zhq_i42gf-itvech_wr25ui-u_ruov2gkqenknbbx2y7ekwwxzt8559wmlq424iif_pbcon6riek_ttdbxwp75aulyh3_naxhvg_pukcmdvjs88b30esv3xgtigs1gsziujd02gs.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/ebtppy-v5hhqxqbousaxhde8pmrm8ky9vg5zhq_i42gf-itvech_wr25ui-u_ruov2gkqenknbbx2y7ekwwxzt8559wmlq424iif_pbcon6riek_ttdbxwp75aulyh3_naxhvg_pukcmdvjs88b30esv3xgtigs1gsziujd02gs.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/ebtppy-v5hhqxqbousaxhde8pmrm8ky9vg5zhq_i42gf-itvech_wr25ui-u_ruov2gkqenknbbx2y7ekwwxzt8559wmlq424iif_pbcon6riek_ttdbxwp75aulyh3_naxhvg_pukcmdvjs88b30esv3xgtigs1gsziujd02gs.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/ebtppy-v5hhqxqbousaxhde8pmrm8ky9vg5zhq_i42gf-itvech_wr25ui-u_ruov2gkqenknbbx2y7ekwwxzt8559wmlq424iif_pbcon6riek_ttdbxwp75aulyh3_naxhvg_pukcmdvjs88b30esv3xgtigs1gsziujd02gs.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/ebtppy-v5hhqxqbousaxhde8pmrm8ky9vg5zhq_i42gf-itvech_wr25ui-u_ruov2gkqenknbbx2y7ekwwxzt8559wmlq424iif_pbcon6riek_ttdbxwp75aulyh3_naxhvg_pukcmdvjs88b30esv3xgtigs1gsziujd02gs.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":2549,"url":"https:\/\/vkrastev1blog.com\/2026\/10\/02\/%d0%bf%d0%b5%d1%82%d0%b8%d1%8f%d1%82-%d0%b2%d1%81%d0%b5%d0%bb%d0%b5%d0%bd%d1%81%d0%ba%d0%b8-%d1%81%d1%8a%d0%b1%d0%be%d1%80-%d0%b2-%d0%ba%d0%be%d0%bd%d1%81%d1%82%d0%b0%d0%bd%d1%82%d0%b8%d0%bd%d0%be\/","url_meta":{"origin":31,"position":1},"title":"Peti ekumenski sabor u Carigradu (553.): spor oko triju glava, Kalcedonovo teolo\u0161ko naslije\u0111e i politika cara Justinijana I.","author":"vkrastev2014","date":"02.10.2026","format":false,"excerpt":"\u041f\u0435\u0442\u0438\u044f\u0442 \u0432\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u0438 \u0441\u044a\u0431\u043e\u0440 \u0432 \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0438\u043d\u043e\u043f\u043e\u043b (553 \u0433.): \u0441\u043f\u043e\u0440\u044a\u0442 \u0437\u0430 \u201e\u0422\u0440\u0438\u0442\u0435 \u0433\u043b\u0430\u0432\u0438\u201c, \u0431\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u0441\u043a\u043e\u0442\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u043e \u043d\u0430 \u0425\u0430\u043b\u043a\u0438\u0434\u043e\u043d \u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430\u0442\u0430 \u043d\u0430 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u042e\u0441\u0442\u0438\u043d\u0438\u0430\u043d I \u0420\u0435\u0437\u044e\u043c\u0435: \u041f\u0435\u0442\u0438\u044f\u0442 \u0432\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u0438 \u0441\u044a\u0431\u043e\u0440, \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043a\u0430\u0442\u043e \u0412\u0442\u043e\u0440\u0438\u044f \u0441\u044a\u0431\u043e\u0440 \u0432 \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0438\u043d\u043e\u043f\u043e\u043b, \u0441\u0435 \u043f\u0440\u043e\u0432\u0435\u0436\u0434\u0430 \u043f\u0440\u0435\u0437 553 \u0433. \u043f\u043e \u0432\u0440\u0435\u043c\u0435 \u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0442\u043e \u043d\u0430 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u042e\u0441\u0442\u0438\u043d\u0438\u0430\u043d I. \u041d\u0435\u0433\u043e\u0432\u0430\u0442\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0430 \u0446\u0435\u043b \u0435 \u0434\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u2026","rel":"","context":"In &quot;\u010clanci posve\u0107eni Bibliji te o duhu i tijelu&quot;","block_context":{"text":"\u010clanci posve\u0107eni Bibliji te o duhu i tijelu","link":"https:\/\/vkrastev1blog.com\/category\/%d1%81%d1%82%d0%b0%d1%82%d0%b8%d0%b8-%d0%bf%d0%be%d1%81%d0%b2%d0%b5%d1%82%d0%b5%d0%bd%d0%b8-%d0%bd%d0%b0-%d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d1%8f%d1%82%d0%b0-%d0%b8-%d0%b7%d0%b0-%d0%b4%d1%83%d1%85%d0%b0\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/chatgpt-image-oct-2-2026-08_51_20-pm.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/chatgpt-image-oct-2-2026-08_51_20-pm.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/chatgpt-image-oct-2-2026-08_51_20-pm.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/chatgpt-image-oct-2-2026-08_51_20-pm.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/chatgpt-image-oct-2-2026-08_51_20-pm.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/chatgpt-image-oct-2-2026-08_51_20-pm.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":657,"url":"https:\/\/vkrastev1blog.com\/2024\/10\/19\/%d0%bc%d0%be%d1%8f-%d0%bf%d0%be%d0%b3%d0%bb%d0%b5%d0%b4-%d0%b7%d0%b0-%d0%b1%d0%be%d0%b3-%d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d1%8f%d1%82%d0%b0-%d0%b8-%d1%85%d1%80%d0%b8%d1%81%d1%82%d0%be%d1%81\/","url_meta":{"origin":31,"position":2},"title":"Moj pogled na Boga, Bibliju i Krista","author":"vkrastev2014","date":"19.10.2024","format":false,"excerpt":"\u0418\u043a\u043e\u043d\u0430 \u043d\u0430 \u0418\u0441\u0443\u0441 \u0425\u0440\u0438\u0441\u0442\u043e\u0441 \u0417\u0434\u0440\u0430\u0432\u0435\u0439\u0442\u0435 \u0438\u0441\u043a\u0430\u043c \u0434\u0430 \u0441\u043f\u043e\u0434\u0435\u043b\u044f \u043c\u043e\u0438\u0442\u0435 \u0440\u0430\u0437\u0441\u044a\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u0430\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u043a \u0437\u0430 \u0411\u043e\u0433 \u0438 \u0437\u0430 \u0425\u0440\u0438\u0441\u0442\u043e\u0441. \u0410\u0437 \u0441\u044a\u043c \u043d\u043e\u0432 \u0432\u044a\u0432 \u0432\u044f\u0440\u0430\u0442\u0430 \u0438 \u0442\u0435\u043f\u044a\u0440\u0432\u0430 \u043c\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438 \u0434\u0430 \u0443\u0447\u0430 \u043f\u043e\u0432\u0435\u0447\u0435 \u0437\u0430 \u0411\u043e\u0433. \u041e\u043f\u0438\u0442\u0432\u0430\u043c \u0441\u0438 \u0434\u0430 \u0441\u0438 \u043e\u0431\u044f\u0441\u043d\u044f \u043d\u0435\u0449\u0430\u0442\u0430 \u043a\u0430\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u043a \u0438 \u0438\u043d\u0436\u0438\u043d\u0435\u0440 \u043d\u043e \u0441\u0438 \u043c\u0438\u0441\u043b\u044f, \u0447\u0435 \u0447\u043e\u0432\u0435\u0448\u043a\u0438\u044f \u043c\u043e\u0437\u044a\u043a \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430\u2026","rel":"","context":"In &quot;\u010clanci posve\u0107eni Bibliji te o duhu i tijelu&quot;","block_context":{"text":"\u010clanci posve\u0107eni Bibliji te o duhu i tijelu","link":"https:\/\/vkrastev1blog.com\/category\/%d1%81%d1%82%d0%b0%d1%82%d0%b8%d0%b8-%d0%bf%d0%be%d1%81%d0%b2%d0%b5%d1%82%d0%b5%d0%bd%d0%b8-%d0%bd%d0%b0-%d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d1%8f%d1%82%d0%b0-%d0%b8-%d0%b7%d0%b0-%d0%b4%d1%83%d1%85%d0%b0\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2024\/10\/image-4.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1733,"url":"https:\/\/vkrastev1blog.com\/2025\/01\/29\/%d0%b7%d0%b0-%d0%b1%d0%be%d0%b3-%d0%b8-%d0%b2%d1%81%d0%b5%d0%bb%d0%b5%d0%bd%d0%b0%d1%82%d0%b0\/","url_meta":{"origin":31,"position":3},"title":"Za Boga i Svemir","author":"vkrastev2014","date":"29.01.2025","format":false,"excerpt":"\u041f\u0440\u0438\u0447\u0438\u043d\u0438 \u0434\u0430 \u0432\u044f\u0440\u0432\u0430\u043c\u0435, \u0447\u0435 \u0411\u043e\u0433 \u043d\u0430\u0438\u0441\u0442\u0438\u043d\u0430 \u0441\u044a\u0449\u0435\u0441\u0442\u0432\u0443\u0432\u0430. \u043e\u0442 \u041c\u0435\u0440\u0438\u043b\u0438\u043d \u0410\u0434\u0430\u043c\u0441\u044a\u043d \u0412\u0441\u0435\u043b\u0435\u043d\u0430\u0442\u0430 \u0438\u043c\u0430 \u043d\u0430\u0447\u0430\u043b\u043e - \u043a\u0430\u043a\u0432\u043e \u0433\u043e \u0435 \u043f\u0440\u0435\u0434\u0438\u0437\u0432\u0438\u043a\u0430\u043b\u043e? \u0423\u0447\u0435\u043d\u0438\u0442\u0435 \u0441\u0430 \u0443\u0431\u0435\u0434\u0435\u043d\u0438, \u0447\u0435 \u043d\u0430\u0448\u0430\u0442\u0430 \u0412\u0441\u0435\u043b\u0435\u043d\u0430 \u0435 \u0437\u0430\u043f\u043e\u0447\u043d\u0430\u043b\u0430 \u0441 \u0435\u0434\u043d\u0430 \u043e\u0433\u0440\u043e\u043c\u043d\u0430 \u0435\u043a\u0441\u043f\u043b\u043e\u0437\u0438\u044f \u043d\u0430 \u0435\u043d\u0435\u0440\u0433\u0438\u044f \u0438 \u0441\u0432\u0435\u0442\u043b\u0438\u043d\u0430, \u043a\u043e\u044f\u0442\u043e \u043d\u0430\u0440\u0438\u0447\u0430\u043c\u0435 \u0413\u043e\u043b\u0435\u043c\u0438\u044f\u0442 \u0432\u0437\u0440\u0438\u0432. \u0422\u043e\u0432\u0430 \u0435\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0441\u044a\u0431\u0438\u0442\u0438\u0435 \u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e \u043d\u0430\u0447\u0430\u043b\u043e\u0442\u043e \u043d\u0430 \u0432\u0441\u0438\u0447\u043a\u043e, \u043a\u043e\u0435\u0442\u043e \u0441\u044a\u0449\u0435\u0441\u0442\u0432\u0443\u0432\u0430: \u0412\u0441\u0435\u043b\u0435\u043d\u0430\u0442\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u0442\u043e\u2026","rel":"","context":"In &quot;\u010clanci posve\u0107eni Bibliji te o duhu i tijelu&quot;","block_context":{"text":"\u010clanci posve\u0107eni Bibliji te o duhu i tijelu","link":"https:\/\/vkrastev1blog.com\/category\/%d1%81%d1%82%d0%b0%d1%82%d0%b8%d0%b8-%d0%bf%d0%be%d1%81%d0%b2%d0%b5%d1%82%d0%b5%d0%bd%d0%b8-%d0%bd%d0%b0-%d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d1%8f%d1%82%d0%b0-%d0%b8-%d0%b7%d0%b0-%d0%b4%d1%83%d1%85%d0%b0\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2025\/01\/093e0eeeb6f9dbc2d2ef6a13bec53c59-20240927143705-1.jpeg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2025\/01\/093e0eeeb6f9dbc2d2ef6a13bec53c59-20240927143705-1.jpeg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2025\/01\/093e0eeeb6f9dbc2d2ef6a13bec53c59-20240927143705-1.jpeg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2025\/01\/093e0eeeb6f9dbc2d2ef6a13bec53c59-20240927143705-1.jpeg?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":2537,"url":"https:\/\/vkrastev1blog.com\/2026\/10\/02\/%d1%82%d1%80%d0%b5%d1%82%d0%b8%d1%8f%d1%82-%d0%b2%d1%81%d0%b5%d0%bb%d0%b5%d0%bd%d1%81%d0%ba%d0%b8-%d1%81%d1%8a%d0%b1%d0%be%d1%80-%d0%b2-%d0%b5%d1%84%d0%b5%d1%81-431-%d0%b3-%d1%85%d1%80%d0%b8%d1%81\/","url_meta":{"origin":31,"position":4},"title":"Tre\u0107i ekumenski sabor u Efezu (431.): kristolo\u0161ki spor izme\u0111u \u0106irila Aleksandrijskog i Nestorija i afirmacija nauka o Majci Bo\u017ejoj","author":"vkrastev2014","date":"02.10.2026","format":false,"excerpt":"\u0422\u0440\u0435\u0442\u0438\u044f\u0442 \u0432\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u0438 \u0441\u044a\u0431\u043e\u0440 \u0432 \u0415\u0444\u0435\u0441 (431 \u0433.): \u0445\u0440\u0438\u0441\u0442\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u0438\u044f\u0442 \u0441\u043f\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u041a\u0438\u0440\u0438\u043b \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0438\u0439\u0441\u043a\u0438 \u0438 \u041d\u0435\u0441\u0442\u043e\u0440\u0438\u0439 \u0438 \u0443\u0442\u0432\u044a\u0440\u0436\u0434\u0430\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0443\u0447\u0435\u043d\u0438\u0435\u0442\u043e \u0437\u0430 \u0411\u043e\u0433\u043e\u0440\u043e\u0434\u0438\u0446\u0430 \u041d\u0430\u0443\u0447\u043d\u043e-\u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e \u0438 \u0431\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u0441\u043a\u043e \u0438\u0437\u0441\u043b\u0435\u0434\u0432\u0430\u043d\u0435 \u0410\u0432\u0442\u043e\u0440: \u0412\u0435\u043b\u0438\u0441\u043b\u0430\u0432 \u041a\u0440\u044a\u0441\u0442\u0435\u0432\u0422\u0435\u043c\u0430: \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0430 \u0440\u0430\u043d\u043d\u0430\u0442\u0430 \u0426\u044a\u0440\u043a\u0432\u0430 \u0438 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043d\u0430 \u0445\u0440\u0438\u0441\u0442\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u0442\u0430 \u0434\u043e\u0433\u043c\u0430\u0442\u0438\u043a\u0430\u041f\u0435\u0440\u0438\u043e\u0434: 428\u2013451 \u0433.\u041e\u0441\u043d\u043e\u0432\u043d\u043e \u0441\u044a\u0431\u0438\u0442\u0438\u0435: \u0422\u0440\u0435\u0442\u0438\u044f\u0442 \u0432\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u0438 \u0441\u044a\u0431\u043e\u0440, \u0415\u0444\u0435\u0441, 431 \u0433. \u0420\u0435\u0437\u044e\u043c\u0435 \u0422\u0440\u0435\u0442\u0438\u044f\u0442 \u0432\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u0438 \u0441\u044a\u0431\u043e\u0440, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u2026","rel":"","context":"In &quot;\u010clanci posve\u0107eni Bibliji te o duhu i tijelu&quot;","block_context":{"text":"\u010clanci posve\u0107eni Bibliji te o duhu i tijelu","link":"https:\/\/vkrastev1blog.com\/category\/%d1%81%d1%82%d0%b0%d1%82%d0%b8%d0%b8-%d0%bf%d0%be%d1%81%d0%b2%d0%b5%d1%82%d0%b5%d0%bd%d0%b8-%d0%bd%d0%b0-%d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d1%8f%d1%82%d0%b0-%d0%b8-%d0%b7%d0%b0-%d0%b4%d1%83%d1%85%d0%b0\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/chatgpt-image-oct-2-2026-08_12_12-pm.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/chatgpt-image-oct-2-2026-08_12_12-pm.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/chatgpt-image-oct-2-2026-08_12_12-pm.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/chatgpt-image-oct-2-2026-08_12_12-pm.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/chatgpt-image-oct-2-2026-08_12_12-pm.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/chatgpt-image-oct-2-2026-08_12_12-pm.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":2556,"url":"https:\/\/vkrastev1blog.com\/2026\/10\/02\/%d1%88%d0%b5%d1%81%d1%82%d0%b8%d1%8f%d1%82-%d0%b2%d1%81%d0%b5%d0%bb%d0%b5%d0%bd%d1%81%d0%ba%d0%b8-%d1%81%d1%8a%d0%b1%d0%be%d1%80-%d0%b2-%d0%ba%d0%be%d0%bd%d1%81%d1%82%d0%b0%d0%bd%d1%82%d0%b8%d0%bd\/","url_meta":{"origin":31,"position":5},"title":"\u0160esti ekumenski sabor u Carigradu (680\u2013681): osuda monotelitizma i potvrda dviju volja i dvaju djelovanja u Isusu Kristu","author":"vkrastev2014","date":"02.10.2026","format":false,"excerpt":"\u0428\u0435\u0441\u0442\u0438\u044f\u0442 \u0432\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u0438 \u0441\u044a\u0431\u043e\u0440 \u0432 \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0438\u043d\u043e\u043f\u043e\u043b (680\u2013681 \u0433.): \u043e\u0441\u044a\u0436\u0434\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u043c\u043e\u043d\u043e\u0442\u0435\u043b\u0438\u0442\u0441\u0442\u0432\u043e\u0442\u043e \u0438 \u0443\u0442\u0432\u044a\u0440\u0436\u0434\u0430\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0434\u0432\u0435\u0442\u0435 \u0432\u043e\u043b\u0438 \u0438 \u0434\u0432\u0435\u0442\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u0418\u0438\u0441\u0443\u0441 \u0425\u0440\u0438\u0441\u0442\u043e\u0441 \u041d\u0430\u0443\u0447\u043d\u043e-\u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0430 \u0441\u0442\u0430\u0442\u0438\u044f \u0437\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0432\u0430\u043d\u0435 \u0432 WordPress \u0420\u0435\u0437\u044e\u043c\u0435: \u0428\u0435\u0441\u0442\u0438\u044f\u0442 \u0432\u0441\u0435\u043b\u0435\u043d\u0441\u043a\u0438 \u0441\u044a\u0431\u043e\u0440, \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043a\u0430\u0442\u043e \u0422\u0440\u0435\u0442\u0438\u044f \u0441\u044a\u0431\u043e\u0440 \u0432 \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0438\u043d\u043e\u043f\u043e\u043b, \u0441\u0435 \u043f\u0440\u043e\u0432\u0435\u0436\u0434\u0430 \u0432 \u043f\u0435\u0440\u0438\u043e\u0434\u0430 680\u2013681 \u0433. \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u0442\u043e \u043d\u0430 \u0432\u0438\u0437\u0430\u043d\u0442\u0438\u0439\u0441\u043a\u0438\u044f \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0438\u043d IV\u2026","rel":"","context":"In &quot;\u010clanci posve\u0107eni Bibliji te o duhu i tijelu&quot;","block_context":{"text":"\u010clanci posve\u0107eni Bibliji te o duhu i tijelu","link":"https:\/\/vkrastev1blog.com\/category\/%d1%81%d1%82%d0%b0%d1%82%d0%b8%d0%b8-%d0%bf%d0%be%d1%81%d0%b2%d0%b5%d1%82%d0%b5%d0%bd%d0%b8-%d0%bd%d0%b0-%d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d1%8f%d1%82%d0%b0-%d0%b8-%d0%b7%d0%b0-%d0%b4%d1%83%d1%85%d0%b0\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/yxsv0k-cfybsgrn4iacbsni6wvorwsimqx4mcnk6i7vvno8-yygtibr2p6c7uhf18h7kykuh-oqxfnmevvk2efigpws1vzqug_m-ryim8mdynspdwkucquhts-ckr3g53iyvlogvjhinycbsjewtpqbgjh-apj7ffnumanhcavu.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/yxsv0k-cfybsgrn4iacbsni6wvorwsimqx4mcnk6i7vvno8-yygtibr2p6c7uhf18h7kykuh-oqxfnmevvk2efigpws1vzqug_m-ryim8mdynspdwkucquhts-ckr3g53iyvlogvjhinycbsjewtpqbgjh-apj7ffnumanhcavu.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/yxsv0k-cfybsgrn4iacbsni6wvorwsimqx4mcnk6i7vvno8-yygtibr2p6c7uhf18h7kykuh-oqxfnmevvk2efigpws1vzqug_m-ryim8mdynspdwkucquhts-ckr3g53iyvlogvjhinycbsjewtpqbgjh-apj7ffnumanhcavu.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/yxsv0k-cfybsgrn4iacbsni6wvorwsimqx4mcnk6i7vvno8-yygtibr2p6c7uhf18h7kykuh-oqxfnmevvk2efigpws1vzqug_m-ryim8mdynspdwkucquhts-ckr3g53iyvlogvjhinycbsjewtpqbgjh-apj7ffnumanhcavu.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/vkrastev1blog.com\/wp-content\/uploads\/2026\/10\/yxsv0k-cfybsgrn4iacbsni6wvorwsimqx4mcnk6i7vvno8-yygtibr2p6c7uhf18h7kykuh-oqxfnmevvk2efigpws1vzqug_m-ryim8mdynspdwkucquhts-ckr3g53iyvlogvjhinycbsjewtpqbgjh-apj7ffnumanhcavu.jpg?resize=1050%2C600&ssl=1 3x"},"classes":[]}],"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/vkrastev1blog.com\/wp-json\/wp\/v2\/posts\/31","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vkrastev1blog.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vkrastev1blog.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vkrastev1blog.com\/wp-json\/wp\/v2\/users\/65283547"}],"replies":[{"embeddable":true,"href":"https:\/\/vkrastev1blog.com\/wp-json\/wp\/v2\/comments?post=31"}],"version-history":[{"count":8,"href":"https:\/\/vkrastev1blog.com\/wp-json\/wp\/v2\/posts\/31\/revisions"}],"predecessor-version":[{"id":42,"href":"https:\/\/vkrastev1blog.com\/wp-json\/wp\/v2\/posts\/31\/revisions\/42"}],"wp:attachment":[{"href":"https:\/\/vkrastev1blog.com\/wp-json\/wp\/v2\/media?parent=31"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vkrastev1blog.com\/wp-json\/wp\/v2\/categories?post=31"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vkrastev1blog.com\/wp-json\/wp\/v2\/tags?post=31"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}