{"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":"Generyki j\u0119zyka Java wyja\u015bnione w skr\u00f3cie z przyk\u0142adami"},"content":{"rendered":"<p>Aby uzyska\u0107 wi\u0119cej informacji, zobacz cz\u0119sto zadawane pytania:<\/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>Oto w skr\u00f3cie kilka wa\u017cnych punkt\u00f3w z tego FAQ.<\/p>\n<p>Przyk\u0142ad (typu og\u00f3lnego):<\/p>\n<blockquote><p><tt> klasa Para&lt;X,Y&gt; {\u00a0<\/tt><br \/>\n<tt> \u00a0 najpierw prywatny X;<\/tt><br \/>\n<tt> \u00a0 prywatny Y drugi;<\/tt><tt> \u00a0 publiczna Para(X a1, Y a2) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 pierwszy = a1;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 sekunda = a2;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 public X getFirst() { najpierw zwr\u00f3\u0107; }<\/tt><br \/>\n<tt> \u00a0 public Y getSecond() { zwr\u00f3\u0107 sekund\u0119; }<\/tt><br \/>\n<tt> \u00a0 public void setFirst(X arg)\u00a0 { pierwszy = arg; }<\/tt><br \/>\n<tt> \u00a0 public void setSecond(Y arg) { sekunda = arg; }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Klasa <tt> Para<\/tt> ma dwa parametry typu <tt> X <\/tt> I <tt> Y<\/tt> .\u00a0 S\u0105 one zast\u0119powane argumentami typu, gdy jest to typ og\u00f3lny <tt> Para<\/tt> jest instancja. Na przyk\u0142ad w deklaracji <tt> Para&lt;String, Data&gt;<\/tt> parametr typu <tt> X<\/tt> zostaje zast\u0105piony argumentem typu <tt> Smyczkowy<\/tt> I <tt> Y<\/tt> zostaje zast\u0105piony przez\u00a0 <tt> Data<\/tt> .<br \/>\nZakres identyfikator\u00f3w <tt> X <\/tt> I <tt> Y<\/tt> Jest<b> <i> <\/i> <\/b> ca\u0142\u0105 definicj\u0119 klasy.\u00a0 W tym zakresie dwa parametry typu <tt> X <\/tt> I <tt> Y<\/tt> s\u0105 u\u017cywane tak, jak by\u0142y typami (z pewnymi ograniczeniami). W powy\u017cszym przyk\u0142adzie parametry typu s\u0142u\u017c\u0105 jako argument i typ zwracany metod instancji oraz typy p\u00f3l instancji.<br \/>\nParametry typu mo\u017cna deklarowa\u0107 z granicami. Granice daj\u0105 dost\u0119p do metod nieznanego typu, kt\u00f3ry reprezentuje parametr type. W naszym przyk\u0142adzie nie wywo\u0142ujemy \u017cadnych metod nieznanego typu <tt> X <\/tt> I <tt> Y<\/tt> . Z tego powodu te dwa parametry typu s\u0105 nieograniczone.<\/p>\n<p>Przyk\u0142ad (konkretnego typu sparametryzowanego):<\/p>\n<blockquote><p><tt> publiczna niewa\u017cna printPair(<b> <span style=\"color:#000099;\"> Para&lt;String,Long&gt;<\/span> <\/b> para) {<\/tt><br \/>\n<tt> \u00a0 System.out.println(\"(\"+pair.getFirst()+\",\"+pair.getSecond()+\")\");<\/tt><br \/>\n<tt> }<\/tt><tt> <b> <span style=\"color:#000099;\"> Para&lt;String,Long&gt;<\/span> <\/b> limit = nowy <b> <span style=\"color:#000099;\"> Para&lt;String,Long&gt;<\/span> <\/b> (\u201emaksimum\u201d, 1024L);<\/tt><br \/>\n<tt> printPair(limit);<\/tt><\/p><\/blockquote>\n<p>Przyk\u0142ad (typu sparametryzowanego za pomoc\u0105 symboli wieloznacznych):<\/p>\n<blockquote>\n<blockquote><p><tt> publiczna niewa\u017cna printPair(<b> <span style=\"color:#000099;\"> Para&lt;?,?&gt;<\/span> <\/b> para) {<\/tt><br \/>\n<tt> \u00a0 System.out.println(\"(\"+pair.getFirst()+\",\"+pair.getSecond()+\")\");<\/tt><br \/>\n<tt> }<\/tt><tt> <b> <span style=\"color:#000099;\"> Para&lt;?,?&gt;<\/span> <\/b> limit = nowy <b> <span style=\"color:#000099;\"> Para&lt;String,Long&gt;<\/span> <\/b> (\u201emaksimum\u201d, 1024L);<\/tt><br \/>\n<tt> printPair(limit);<\/tt><\/p><\/blockquote>\n<\/blockquote>\n<p>Wszystkie wyst\u0105pienia typu og\u00f3lnego maj\u0105 t\u0119 sam\u0105 reprezentacj\u0119 typu \u015brodowiska wykonawczego, a mianowicie reprezentacj\u0119 typu surowego. Na przyk\u0142ad instancje typu og\u00f3lnego <tt> Lista<\/tt> , takie jak <tt> Lista&lt;Data&gt;<\/tt> , <tt> Lista&lt;String&gt;<\/tt> , <tt> Lista&lt;D\u0142ugi&gt;<\/tt> itp. maj\u0105 r\u00f3\u017cne typy statyczne w czasie kompilacji, ale ten sam typ dynamiczny <tt> Lista <\/tt> w czasie wykonywania.<\/p>\n<p>Obsada sk\u0142ada si\u0119 z dw\u00f3ch cz\u0119\u015bci:<\/p>\n<ul>\n<li>statyczna kontrola typu wykonywana przez kompilator w czasie kompilacji i<\/li>\n<li>dynamiczna kontrola typu wykonywana przez maszyn\u0119 wirtualn\u0105 w czasie wykonywania.<\/li>\n<\/ul>\n<p>Cz\u0119\u015b\u0107 statyczna sortuje bezsensowne rzuty, kt\u00f3re nie mog\u0105 si\u0119 powie\u015b\u0107, takie jak rzutowanie z <tt> Smyczkowy<\/tt> To <tt> Data<\/tt> lub z <tt> Lista&lt;String&gt;<\/tt> To <tt> Lista&lt;Data&gt;<\/tt> .<\/p>\n<p>Cz\u0119\u015b\u0107 dynamiczna wykorzystuje informacje o typie \u015brodowiska wykonawczego i przeprowadza kontrol\u0119 typu w czasie wykonywania.\u00a0 Podnosi A <tt> Wyj\u0105tek ClassCast<\/tt> je\u015bli typ dynamiczny obiektu nie jest typem docelowym (lub podtypem typu docelowego) rzutowania. Przyk\u0142adami odlew\u00f3w z cz\u0119\u015bci\u0105 dynamiczn\u0105 s\u0105 odlewy <tt> Obiekt<\/tt> To <tt> Smyczkowy<\/tt> lub z <tt> Obiekt<\/tt> To <tt> Lista&lt;String&gt;<\/tt> .\u00a0 S\u0105 to tak zwane downcasty, od nadtypu do podtypu.<\/p>\n<p>Przyk\u0142adami konkretnych typ\u00f3w sparametryzowanych s\u0105 <tt> Lista&lt;String&gt;<\/tt> , <tt> Mapa&lt;String,Data&gt;<\/tt> , ale nie <tt> Lista&lt;? rozszerza numer &gt;<\/tt> Lub <tt> Mapa&lt;String,?&gt;<\/tt> .<\/p>\n<p>Czasami oczekuje si\u0119, \u017ce a <tt> Lista&lt;Object&gt;<\/tt> by\u0142by nadtypem a <tt> Lista&lt;String&gt;<\/tt> , poniewa\u017c <tt> Obiekt<\/tt> jest nadtypem <tt> Smyczkowy<\/tt> .\u00a0 Oczekiwanie to wynika z faktu, \u017ce dla tablic istnieje tego typu zale\u017cno\u015b\u0107:\u00a0 <tt> Obiekt[]<\/tt> jest nadtypem <tt> Smyczkowy[]<\/tt> , poniewa\u017c <tt> Obiekt<\/tt> jest nadtypem <tt> Smyczkowy<\/tt> . (Ten typ relacji jest znany jako <i> kowariancja<\/i> .) Relacja superpodtyp\u00f3w typ\u00f3w komponent\u00f3w rozci\u0105ga si\u0119 na odpowiednie typy tablic. Nie istnieje taka relacja typu dla instancji typ\u00f3w og\u00f3lnych. (Typy sparametryzowane to <i> nie<\/i> kowariant.)<\/p>\n<p>Brak relacji superpodtypu mi\u0119dzy instancjami tego samego typu og\u00f3lnego ma r\u00f3\u017cne konsekwencje.\u00a0 Oto przyk\u0142ad.<\/p>\n<p>Przyk\u0142ad:<\/p>\n<p><tt> void printAll(ArrayList&lt;Object&gt; c) {<\/tt><br \/>\n<tt> \u00a0 dla (Obiekt o : c)\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 System.out.println(o);<\/tt><br \/>\n<tt> }<\/tt><tt> Lista ArrayList&lt;String&gt; = nowa lista ArrayList&lt;String&gt;();<\/tt><br \/>\n<tt> ... wype\u0142nij list\u0119 ...<\/tt><br \/>\n<tt> printAll(lista);\u00a0\u00a0 \/\/ b\u0142\u0105d<\/tt><\/p>\n<p>A <tt> ArrayList&lt;String&gt;<\/tt> obiektu nie mo\u017cna przekaza\u0107 jako argumentu do metody \u017c\u0105daj\u0105cej a <tt> ArrayList&lt;Object&gt;<\/tt> poniewa\u017c te dwa typy s\u0105 instancjami tego samego typu og\u00f3lnego, ale for <i> r\u00f3\u017cny<\/i> argumenty typu i z tego powodu nie s\u0105 one ze sob\u0105 kompatybilne.<\/p>\n<p>Konkretne typy sparametryzowane to konkretne instancje typu og\u00f3lnego.\u00a0 S\u0105 prawie jak typy; istnieje tylko kilka ogranicze\u0144.\u00a0 NIE mo\u017cna ich u\u017cywa\u0107 do nast\u0119puj\u0105cych cel\u00f3w:<\/p>\n<ul>\n<li>do tworzenia tablic<\/li>\n<li>w obs\u0142udze wyj\u0105tk\u00f3w<\/li>\n<li>w dos\u0142owno\u015bci klasowej<\/li>\n<li>w <tt> instancja<\/tt> wyra\u017cenie<\/li>\n<\/ul>\n<p>Tablice zawieraj\u0105ce elementy, kt\u00f3rych typ jest konkretnym typem sparametryzowanym, s\u0105 nielegalne.<\/p>\n<p>Przyk\u0142ad (niedozwolony typ tablicy):<\/p>\n<p><tt> statyczny test niewa\u017cno\u015bci() {<\/tt><br \/>\n<tt> \u00a0 <b> <span style=\"color:#660000;\"> Para&lt;Integer,Integer&gt;[]<\/span> <\/b> intPairArr = nowy <b> <span style=\"color:#660000;\"> Para&lt;Integer,Integer&gt;[10]<\/span> <\/b> ; <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 addElements(intPairArr);\u00a0<\/tt><br \/>\n<tt> \u00a0 Para&lt;Integer,Integer&gt; para = intPairArr[1];<\/tt><br \/>\n<tt> \u00a0 Liczba ca\u0142kowita i = pair.getFirst();<\/tt><br \/>\n<tt> \u00a0 para.setSekunda(i);<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> statyczne puste elementy addElements(<b> Obiekt[]<\/b> objArr) {<\/tt><br \/>\n<tt> \u00a0 objArr[0] = nowa para&lt;Integer,Integer&gt;(0,0);<\/tt><br \/>\n<tt> \u00a0 objArr[1] = nowa para&lt;String,String&gt;(\"\",\"\");\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ powinno zako\u0144czy\u0107 si\u0119 niepowodzeniem z wyj\u0105tkiem ArrayStoreException<\/tt><br \/>\n<tt> }<\/tt><\/p>\n<p>Kompilator zabrania tworzenia tablic, kt\u00f3rych typem komponentu jest konkretny typ sparametryzowany, np <tt> Para&lt;Integer,Integer&gt;<\/tt> w naszym przyk\u0142adzie.\u00a0 W poprzednim wpisie om\u00f3wili\u015bmy, dlaczego uzasadnione jest, aby kompilator kwalifikowa\u0142 a<span style=\"color:#000000;\"> <tt> Para&lt;Integer,Integer&gt;[]<\/tt> <\/span> jako nielegalne.\u00a0 Kluczowym problemem jest to, \u017ce kompilator i system wykonawczy musz\u0105 zapewni\u0107, \u017ce tablica jest tablic\u0105 typu a <i> jednorodny<\/i> sekwencja element\u00f3w tego samego typu.\u00a0 Jedna ze kontroli typu, a mianowicie kontrola magazynu tablic wykonywana przez maszyn\u0119 wirtualn\u0105 w czasie wykonywania, nie wykrywa nieprawid\u0142owego wstawienia obcego elementu. W przyk\u0142adzie drugie wstawienie w <tt> dodaj elementy<\/tt> metoda powinna zako\u0144czy\u0107 si\u0119 niepowodzeniem, poniewa\u017c dodawana by\u0142a para ci\u0105g\u00f3w do tablicy warto\u015bci ca\u0142kowitych, ale nie zako\u0144czy\u0142a si\u0119 niepowodzeniem zgodnie z oczekiwaniami. Powody zosta\u0142y om\u00f3wione w poprzednim wpisie.<\/p>\n<p>Je\u015bli nie mo\u017cemy u\u017cywa\u0107 tablic przechowuj\u0105cych elementy, kt\u00f3rych typ jest konkretnym typem sparametryzowanym, czego u\u017cywamy jako obej\u015bcia?<\/p>\n<p>Rozwa\u017cmy 3 mo\u017cliwe obej\u015bcia:<\/p>\n<ul>\n<li>szereg surowych typ\u00f3w<\/li>\n<li>tablica nieograniczonego typu parametrycznego z symbolami wieloznacznymi<\/li>\n<li>kolekcja zamiast tablicy<\/li>\n<\/ul>\n<p>Chocia\u017c tablice konkretnych typ\u00f3w sparametryzowanych s\u0105 nielegalne, kolekcje konkretnych typ\u00f3w sparametryzowanych s\u0105 dozwolone.<\/p>\n<p>Typ sparametryzowany za pomoc\u0105 symboli wieloznacznych jest instancj\u0105 typu og\u00f3lnego, w kt\u00f3rym co najmniej jeden argument typu jest symbolem wieloznacznym.\u00a0 Przyk\u0142adami typ\u00f3w sparametryzowanych za pomoc\u0105 symboli wieloznacznych s\u0105 <tt> Kolekcja&lt;?&gt;<\/tt> , <tt> Lista&lt;? rozszerza numer &gt;<\/tt> , <tt> Komparator&lt;? super String&gt;<\/tt> I <tt> Para&lt;String,?&gt;<\/tt> . Typ sparametryzowany za pomoc\u0105 symbolu wieloznacznego oznacza rodzin\u0119 typ\u00f3w zawieraj\u0105c\u0105 konkretne instancje typu og\u00f3lnego.\u00a0 Rodzaj u\u017cytego symbolu wieloznacznego okre\u015bla, kt\u00f3re konkretne sparametryzowane typy nale\u017c\u0105 do rodziny.\u00a0 Na przyk\u0142ad typ sparametryzowany symbolem wieloznacznym <tt> Kolekcja&lt;?&gt;<\/tt> oznacza rodzin\u0119 wszystkich instancji <tt> Kolekcja<\/tt> interfejs niezale\u017cnie od argumentu typu.\u00a0 Typ sparametryzowany symbolem wieloznacznym <tt> Lista&lt;? rozszerza numer &gt;<\/tt> oznacza rodzin\u0119 wszystkich typ\u00f3w list, kt\u00f3rych typ elementu jest podtypem\u00a0 <tt> Numer<\/tt> .\u00a0 Typ sparametryzowany symbolem wieloznacznym <tt> Komparator&lt;? super String&gt;<\/tt> jest rodzin\u0105 wszystkich instancji <tt> Komparator<\/tt> interfejs dla typ\u00f3w argument\u00f3w typu, kt\u00f3re s\u0105 nadtypami <tt> Smyczkowy.<\/tt><\/p>\n<p><strong><em>Typ sparametryzowany za pomoc\u0105 symboli wieloznacznych nie jest typem w zwyk\u0142ym sensie (innym ni\u017c niesparametryzowana klasa\/interfejs lub typ surowy).<\/em> <\/strong><\/p>\n<p>Do wpisywania mo\u017cna u\u017cywa\u0107 typ\u00f3w sparametryzowanych za pomoc\u0105 symboli wieloznacznych (takich jak niesparametryzowane klasy i interfejsy):<\/p>\n<ul>\n<li>jako argumenty i metody zwracane<\/li>\n<li>jako typ pola lub lokalna zmienna referencyjna<\/li>\n<li>jako typ komponentu tablicy jako argument typu innych sparametryzowanych typ\u00f3w<\/li>\n<li>jako typ celu w rzutach<\/li>\n<\/ul>\n<p>Nie tylko typy mog\u0105 by\u0107 og\u00f3lne, ale metody r\u00f3wnie\u017c mog\u0105 by\u0107 og\u00f3lne. Metody statyczne i niestatyczne, a tak\u017ce konstruktory mog\u0105 mie\u0107 parametry typu. Sk\u0142adnia deklaracji parametr\u00f3w typu formalnego jest podobna do sk\u0142adni typ\u00f3w og\u00f3lnych. Sekcja parametru typu jest ograniczona nawiasami ostrymi i pojawia si\u0119 przed typem zwracanym przez metod\u0119. Jego sk\u0142adnia i znaczenie s\u0105 identyczne z list\u0105 parametr\u00f3w typu og\u00f3lnego.<\/p>\n<p>Oto przyk\u0142ad rodzaju og\u00f3lnego <tt> maks<\/tt> metoda obliczaj\u0105ca najwi\u0119ksz\u0105 warto\u015b\u0107 w kolekcji element\u00f3w nieznanego typu <tt> A<\/tt> .<\/p>\n<p>Przyk\u0142ad (metody og\u00f3lnej):<\/p>\n<blockquote><p><tt> Kolekcje klas {<\/tt><br \/>\n<tt> \u00a0 publiczna statyka <b> <span style=\"color:#000099;\"> &lt;A rozszerza Por\u00f3wnywalny&lt;A&gt;&gt; A<\/span> <\/b> max(Kolekcja&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.next();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 podczas gdy (xi.hasNext()) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#000099;\"> A<\/span> <\/b> x = xi.nast\u0119pny();<\/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 powr\u00f3t w;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }\u00a0<\/tt><\/p><\/blockquote>\n<p>The <tt> maks<\/tt> metoda ma jeden parametr typu o nazwie<tt> A<\/tt> .\u00a0 Jest to symbol zast\u0119pczy typu elementu kolekcji, na kt\u00f3rym dzia\u0142a metoda. Parametr typu ma ograniczenie; musi to by\u0107 typ b\u0119d\u0105cy podtypem <tt> Por\u00f3wnywalne&lt;A&gt;<\/tt><\/p>\n<p>Przyk\u0142ad (tego samego typu og\u00f3lnego, tym razem <i> z<\/i> miedza):<\/p>\n<blockquote><p><tt> interfejs publiczny Por\u00f3wnywalny&lt;T&gt; {<\/tt><br \/>\n<tt> \u00a0 public int CompareTo(T arg);<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> klasa publiczna TreeMap&lt;Key <b> <span style=\"color:#000066;\"> rozszerza Comparable&lt;Key&gt;<\/span> <\/b> ,Dane&gt;{<\/tt><br \/>\n<tt> \u00a0 prywatna klasa statyczna Entry&lt;K,V&gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 klawisz K;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 warto\u015b\u0107 V;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Wpis&lt;K,V&gt; lewy = null;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Wpis&lt;K,V&gt; prawo = null;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Wpis&lt;K,V&gt; rodzic;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 prywatny przej\u015bciowy wpis&lt;Key,Data&gt; root = null;<\/tt><br \/>\n<tt> \u00a0 ...<\/tt><br \/>\n<tt> \u00a0 prywatny wpis&lt;Key,Data&gt; getEntry(klucz kluczowy) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Entry&lt;Key,Data&gt; p = root;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Klucz k = klucz;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 podczas gdy (p!= null) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int cmp = k.<b> <span style=\"color:#990000;\"> por\u00f3wnajTo(p.key)<\/span> <\/b> ;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 je\u015bli (cmp == 0)<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 zwr\u00f3\u0107 p;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else if (cmp &lt; 0)<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 p = p.lewy;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 w przeciwnym razie\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 p = p.prawo;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 zwr\u00f3\u0107 warto\u015b\u0107 zerow\u0105;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 publiczna warto\u015b\u0107 logiczna zawieraKey(Klucz kluczowy) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 zwr\u00f3\u0107 getEntry(key) != null;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>W powy\u017cszym przyk\u0142adzie parametr type <tt> Klawisz<\/tt> ma granic\u0119 <tt> Por\u00f3wnywalny&lt;Key&gt;<\/tt> .\u00a0 Specyfikacja granicy ma dwa skutki:<\/p>\n<ul>\n<li><i> Daje dost\u0119p do metod okre\u015blonych przez powi\u0105zanie<\/i> .\u00a0 W przyk\u0142adzie zwi\u0105zany <tt> Por\u00f3wnywalny&lt;Key&gt; <\/tt> daje dost\u0119p do <tt> por\u00f3wnaj<\/tt> metod\u0119, kt\u00f3r\u0105 chcemy wywo\u0142a\u0107 przy implementacji naszego <tt> Mapa Drzewa<\/tt> klasa.<\/li>\n<\/ul>\n<ul>\n<li><i> Do tworzenia instancji typu og\u00f3lnego mo\u017cna u\u017cywa\u0107 tylko typ\u00f3w \u201ew granicach\u201d.<\/i> \u00a0 W przyk\u0142adzie sparametryzowany typ, taki jak <tt> TreeMap&lt;Number,String&gt;<\/tt> zosta\u0142by odrzucony, poniewa\u017c typ <tt> Numer<\/tt> nie jest podtypem <tt> Por\u00f3wnywalny&lt;Numer&gt;<\/tt> .\u00a0 Typ sparametryzowany, taki jak <tt> TreeMap&lt;String,String&gt;<\/tt> zosta\u0142by zaakceptowany, poniewa\u017c typ String mie\u015bci si\u0119 w okre\u015blonych granicach, tj. jest podtypem <tt> Por\u00f3wnywalne&lt;String&gt;<\/tt> .<\/li>\n<\/ul>\n<p>Wszystkie klasy, interfejsy i typy wyliczeniowe mog\u0105 by\u0107 u\u017cywane jako powi\u0105zane parametry typu, w tym typy zagnie\u017cd\u017cone i wewn\u0119trzne.\u00a0 Ani typy pierwotne, ani typy tablicowe nie mog\u0105 by\u0107 u\u017cywane jako powi\u0105zane parametry typu.<\/p>\n<p>Przyk\u0142ady (ogranicze\u0144 parametr\u00f3w typu):<\/p>\n<blockquote><p><tt> rozszerza si\u0119 klasa X0 &lt;T <b> <span style=\"color:#000099;\"> wew<\/span> <\/b> &gt; { ... }\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> rozszerza si\u0119 klasa X1 &lt;T <b> <span style=\"color:#000099;\"> Obiekt[]<\/span> <\/b> &gt; { ... } <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> rozszerza si\u0119 klasa X2 &lt;T <b> <span style=\"color:#000099;\"> Numer<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> rozszerza si\u0119 klasa X3 &lt;T <b> <span style=\"color:#000099;\"> Smyczkowy<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> rozszerza si\u0119 klasa X4 &lt;T <b> <span style=\"color:#000099;\"> Mo\u017cliwo\u015b\u0107 uruchomienia<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> rozszerza si\u0119 klasa X5 &lt;T <b> <span style=\"color:#000099;\"> Stan w\u0105tku<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> rozszerza si\u0119 klasa X6 &lt;T <b> <span style=\"color:#000099;\"> Lista<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> rozszerza si\u0119 klasa X7 &lt;T <b> <span style=\"color:#000099;\"> Lista&lt;String&gt;<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> rozszerza si\u0119 klasa X8 &lt;T <b> <span style=\"color:#000099;\"> Lista&lt;? rozszerza numer &gt;<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> rozszerza si\u0119 klasa X9 &lt;T <b> <span style=\"color:#000099;\"> Por\u00f3wnywalny&lt;? super numer&gt;<\/span> <\/b> &gt; { ... }<\/tt><br \/>\n<tt> rozszerza si\u0119 klasa X10&lt;T <b> <span style=\"color:#000099;\"> Mapa.Wpis&lt;?,?&gt;<\/span> <\/b> &gt; { ... }<\/tt><\/p><\/blockquote>\n<p>Przyk\u0142adowy kod pokazuje, \u017ce typy pierwotne, takie jak <tt> wew<\/tt> i typy tablic, takie jak <tt> Obiekt[] <\/tt> nie s\u0105 dozwolone jako powi\u0105zane z parametrem typu.<\/p>\n<p>Typy klas, np <tt> Numer<\/tt> Lub <tt> Smyczkowy<\/tt> i typy interfejs\u00f3w, takie jak <tt> Mo\u017cliwo\u015b\u0107 uruchomienia<\/tt> , s\u0105 dozwolone jako powi\u0105zane z parametrem typu.<\/p>\n<p>Typy wyliczeniowe, takie jak <tt> Stan w\u0105tku<\/tt> s\u0105 r\u00f3wnie\u017c dozwolone jako powi\u0105zane z parametrami typu. <tt> Stan w\u0105tku<\/tt> jest przyk\u0142adem typu zagnie\u017cd\u017conego u\u017cywanego jako powi\u0105zany parametr typu.\u00a0 Dozwolone s\u0105 r\u00f3wnie\u017c niestatyczne typy wewn\u0119trzne.<\/p>\n<p>Typy surowe s\u0105 dozwolone jako powi\u0105zane z parametrami typu; <tt> <span style=\"color:#000000;\"> Lista<\/span> <\/tt> jest przyk\u0142adem.<\/p>\n<p>Typy parametryczne s\u0105 dozwolone jako powi\u0105zane z parametrami typu, w tym konkretne typy sparametryzowane, takie jak <tt> Lista&lt;String&gt;<\/tt> , ograniczone typy parametryczne z symbolami wieloznacznymi, takie jak <tt> Lista&lt;? rozszerza numer &gt;<\/tt> I <tt> Por\u00f3wnywalny&lt;? super Long&gt;<\/tt> i nieograniczone typy parametryczne z symbolami wieloznacznymi, takie jak <tt> Mapa.Wpis&lt;?,?&gt;<\/tt> .\u00a0 Powi\u0105zanie, kt\u00f3re jest typem sparametryzowanym za pomoc\u0105 symbolu wieloznacznego, dopuszcza jako argument typu wszystkie typy nale\u017c\u0105ce do rodziny typ\u00f3w oznaczanej przez symbol wieloznaczny.\u00a0 Powi\u0105zanie typu sparametryzowanego za pomoc\u0105 symbolu wieloznacznego zapewnia jedynie ograniczony dost\u0119p do p\u00f3l i metod; ograniczenia zale\u017c\u0105 od rodzaju symbolu wieloznacznego.<\/p>\n<p>Przyk\u0142ad (typu sparametryzowanego za pomoc\u0105 symboli wieloznacznych jako powi\u0105zany parametr typu):<\/p>\n<blockquote><p><tt> klasa X&lt;<b> <span style=\"color:#000099;\"> T rozszerza List&lt;? rozszerza numer &gt;<\/span> <\/b> &gt; {<\/tt><br \/>\n<tt> \u00a0 public void SomeMethod(T t) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 t.add(nowy d\u0142ugi(0L));\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 Liczba n = t.usu\u0144(0);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> pr\u00f3ba klasowa {<\/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;\"> D\u0142ugi<\/span> <\/b> <span style=\"color:#000000;\"> &gt;&gt; x1 = nowy 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;\"> Smyczkowy<\/span> <\/b> <span style=\"color:#000000;\"> &gt;&gt; x2 = nowy X&lt;ArrayList&lt;String&gt;&gt;(); <\/span> <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Zmienne referencyjne typu<tt> T <\/tt> (parametr typu) s\u0105 traktowane jak zmienne referencyjne typu wieloznacznego (powi\u0105zanie parametru typu).\u00a0 W naszym przyk\u0142adzie konsekwencj\u0105 jest to, \u017ce kompilator odrzuca wywo\u0142anie metod, kt\u00f3re przyjmuj\u0105 argument \u201enieznanego\u201d typu, kt\u00f3ry oznacza parametr typu, np. <tt> Lista.dodaj<\/tt> , poniewa\u017c granica jest typem sparametryzowanym za pomoc\u0105 symboli wieloznacznych z g\u00f3rn\u0105 granic\u0105.<br \/>\nJednocze\u015bnie zwi\u0105zany <tt> Lista&lt;? rozszerza numer &gt;<\/tt> okre\u015bla typy, kt\u00f3re mog\u0105 by\u0107 u\u017cywane jako argumenty typu. Kompilator akceptuje wszystkie argumenty typu nale\u017c\u0105ce do rodziny typ\u00f3w <tt> Lista&lt;? rozszerza numer &gt;<\/tt> , czyli wszystkie podtypy <tt> Lista<\/tt> z argumentem typu, kt\u00f3ry jest podtypem <tt> Numer<\/tt> .<\/p>\n<p>Parametr typu mo\u017ce s\u0142u\u017cy\u0107 jako granica innego parametru typu.<\/p>\n<p>Przyk\u0142ad (parametru typu u\u017cytego jako powi\u0105zanie parametru typu):<\/p>\n<blockquote><p><tt> klasa Tr\u00f3jka<b> &lt;T&gt;<\/b> {<\/tt><br \/>\n<tt> \u00a0 prywatny T fst, snd, trd;<\/tt><br \/>\n<tt> \u00a0 publiczny &lt;<b> U<\/b> <b> <span style=\"color:#000099;\"> rozci\u0105ga T<\/span> <\/b> , <b> V <span style=\"color:#000099;\"> rozci\u0105ga T<\/span> <\/b> , <b> W <span style=\"color:#000099;\"> rozci\u0105ga T<\/span> <\/b> &gt; Potr\u00f3jny(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>W tym przyk\u0142adzie parametr typu <tt> T<\/tt> klasy sparametryzowanej jest u\u017cywana jako granica parametr\u00f3w typu <tt> U<\/tt> ,\u00a0 <tt> V<\/tt> I <tt> W<\/tt> sparametryzowanej metody instancji tej klasy.<\/p>\n<p>Dalsze mo\u017cliwo\u015bci u\u017cycia parametr\u00f3w typu jako granic innych parametr\u00f3w typu obejmuj\u0105 sytuacje, w kt\u00f3rych typ zagnie\u017cd\u017cony jest zdefiniowany w typie og\u00f3lnym lub klasa lokalna jest zdefiniowana w metodzie og\u00f3lnej.\u00a0 Dozwolone jest nawet u\u017cycie parametru typu jako powi\u0105zania innego parametru typu w tej samej sekcji parametru typu.<\/p>\n<p>Powi\u0105zanie b\u0119d\u0105ce klas\u0105 zapewnia dost\u0119p do wszystkich jej publicznych element\u00f3w cz\u0142onkowskich, czyli publicznych p\u00f3l, metod i typ\u00f3w zagnie\u017cd\u017conych. Nie s\u0105 dost\u0119pne tylko konstruktory, poniewa\u017c nie ma gwarancji, \u017ce podklasa powi\u0105zania ma te same konstruktory co powi\u0105zanie.<\/p>\n<p>Przyk\u0142ad (klasy u\u017cytej jako granica parametru typu):<\/p>\n<blockquote><p><tt> klasa publiczna <span style=\"color:#000000;\"> Superklasa<\/span> {<\/tt><tt> \u00a0\u00a0\u00a0 \/\/ elementy statyczne<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 publiczne wyliczenie EnumType {TO, TO}<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 publiczny obiekt statyczny staticField;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public static void staticMethod() { ... }<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 \/\/ elementy niestatyczne<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 klasa publiczna InnerClass { ... }<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 Obiekt publiczny nonStaticField;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public void nonStaticMethod() { ... }<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 \/\/ konstruktorzy<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 publiczna SuperKlasa() { ... }<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 \/\/ cz\u0142onkowie prywatni<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 prywatny Obiekt privateField;\u00a0<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p>\n<p><tt> publiczna klasa ko\u0144cowa SomeClass&lt;T rozszerza si\u0119 <b> <span style=\"color:#006600;\"> Superklasa<\/span> <\/b> &gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 prywatny obiekt T;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public SomeClass(T t) { obiekt = t; }\u00a0<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 publiczny ci\u0105g toString() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 powr\u00f3t<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"statyczny typ zagnie\u017cd\u017cony\u00a0\u00a0\u00a0 : \"+T.EnumType.class+\"\\n\"\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"pole statyczne\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \u201e+T.staticField+\u201d\\n\u201d<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"metoda statyczna\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \u201e+T.staticMethod()+\u201d\\n\u201d<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"niestatyczny typ zagnie\u017cd\u017cony: \"+T.InnerClass.class+\"\\n\"<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"pole niestatyczne\u00a0\u00a0\u00a0\u00a0\u00a0 : \"+object.nonStaticField+\"\\n\"<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"metoda niestatyczna\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 : \u201e+(nowy T())+\u201d\\n\u201d\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ b\u0142\u0105d<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"private member\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \u201e+object.privateField+\u201d\\n\u201d\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ b\u0142\u0105d\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>Zwi\u0105zany <tt> Superklasa<\/tt> daje dost\u0119p do typ\u00f3w zagnie\u017cd\u017conych, p\u00f3l i metod statycznych oraz p\u00f3l i metod niestatycznych.\u00a0 Tylko konstruktor nie jest dost\u0119pny.\u00a0 Dzieje si\u0119 tak, poniewa\u017c konstruktory nie s\u0105 dziedziczone. Ka\u017cda podklasa definiuje swoje w\u0142asne konstruktory i nie musi obs\u0142ugiwa\u0107 konstruktor\u00f3w swojej nadklasy.\u00a0 Dlatego nie ma gwarancji, \u017ce podklasa <tt> Superklasa<\/tt> b\u0119dzie mia\u0142 tego samego konstruktora, co jego nadklasa.<\/p>\n<p>Kontekst, w kt\u00f3rym<tt> Enum&lt;E rozszerza Enum&lt;E&gt;&gt;<\/tt> &#8221; pojawia si\u0119 deklaracja <tt> Wyliczenie<\/tt> klasa w pakiecie <tt> java.lang<\/tt> :<\/p>\n<blockquote><p><tt> publiczna klasa abstrakcyjna <b> Enum&lt;E rozszerza Enum&lt;E&gt;&gt;<\/b> {<\/tt><br \/>\n<tt> \u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Typ <tt> Wyliczenie<\/tt> jest wsp\u00f3ln\u0105 klas\u0105 bazow\u0105 wszystkich typ\u00f3w wyliczeniowych.\u00a0 W Javie typ wyliczeniowy, taki jak <tt> Kolor<\/tt> jest t\u0142umaczone na klas\u0119 <tt> Kolor<\/tt> to si\u0119 rozci\u0105ga <tt> Wyliczenie&lt;Kolor&gt;<\/tt> . Cel nadklasy <tt> Wyliczenie<\/tt> jest zapewnienie funkcjonalno\u015bci wsp\u00f3lnej dla wszystkich typ\u00f3w wylicze\u0144.<\/p>\n<p>Oto szkic zaj\u0119\u0107 <tt> Wyliczenie<\/tt> :<\/p>\n<blockquote><p><tt> publiczna klasa abstrakcyjna <b> Enum&lt;<span style=\"color:#000099;\"> mi<\/span> rozszerza Enum&lt;E&gt;&gt;<\/b> implementuje Comparable&lt;<b> <span style=\"color:#000099;\"> mi<\/span> <\/b> &gt;, serializowany {<\/tt><br \/>\n<tt> \u00a0 prywatna ko\u0144cowa nazwa ci\u0105gu;<\/tt><br \/>\n<tt> \u00a0 publiczny ko\u0144cowy ci\u0105g nazwa() { ... }<\/tt><tt> \u00a0 prywatny ko\u0144cowy int porz\u0105dkowy;<\/tt><br \/>\n<tt> \u00a0 public final int ordinal() { ... }<\/tt><\/p>\n<p><tt> \u00a0 chronione wyliczenie (nazwa ci\u0105gu, liczba ca\u0142kowita) { ... }<\/tt><\/p>\n<p><tt> \u00a0 public String\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 toString() { ... }<\/tt><br \/>\n<tt> \u00a0 publiczna ko\u0144cowa warto\u015b\u0107 logiczna r\u00f3wna si\u0119 (obiekt inny) { ... }<\/tt><br \/>\n<tt> \u00a0 publiczny ko\u0144cowy int hashCode() { ... }<\/tt><br \/>\n<tt> \u00a0 chroniony obiekt ko\u0144cowy clone() zg\u0142asza wyj\u0105tek CloneNotSupportedException { ... }<\/tt><br \/>\n<tt> \u00a0 publiczny fina\u0142 in CompareTo(<b> <span style=\"color:#000099;\"> mi<\/span> <\/b> o) { ... }<\/tt><\/p>\n<p><tt> \u00a0 publiczny fina\u0142 Class&lt;<b> <span style=\"color:#000099;\"> mi<\/span> <\/b> &gt; getDeclaringClass() { ... }<\/tt><br \/>\n<tt> \u00a0 public static &lt;T rozszerza Enum&lt;T&gt;&gt; T warto\u015b\u0107Of(Class&lt;T&gt; enumType, nazwa ci\u0105gu) { ... }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Zaskakuj\u0105ca cecha w deklaracji \u201e<tt> Enum&lt;E rozszerza Enum&lt;E&gt;&gt;<\/tt> &#8221; jest faktem, \u017ce nowo zdefiniowana klasa <tt> Wyliczenie<\/tt> i jego nowo zdefiniowany parametr typu <tt> mi <\/tt> pojawiaj\u0105 si\u0119 w granicy tego samego parametru typu.\u00a0 Oznacza to, \u017ce <tt> Wyliczenie<\/tt> typ musi zosta\u0107 utworzony dla jednego z jego podtyp\u00f3w.\u00a0 Aby zrozumie\u0107, dlaczego ma to sens, nale\u017cy wzi\u0105\u0107 pod uwag\u0119, \u017ce ka\u017cdy typ wyliczeniowy jest t\u0142umaczony na podtyp <tt> Wyliczenie<\/tt> .<\/p>\n<p>Oto wymy\u015blony typ wyliczeniowy <tt> Kolor<\/tt> :<\/p>\n<blockquote><p><tt> wyliczenie <b> Kolor<\/b> {CZERWONY, NIEBIESKI, ZIELONY}<\/tt><\/p><\/blockquote>\n<p>Kompilator t\u0142umaczy to na nast\u0119puj\u0105c\u0105 klas\u0119:<\/p>\n<blockquote><p><tt> publiczne zaj\u0119cia ko\u0144cowe <b> Kolor<\/b> rozci\u0105ga si\u0119 <b> Wyliczenie&lt;Kolor&gt;<\/b> {<\/tt><br \/>\n<tt> \u00a0 public static final Color[] warto\u015bci() { return (Color[])$VALUES.clone(); }<\/tt><br \/>\n<tt> \u00a0 public static Warto\u015b\u0107 koloru (nazwa ci\u0105gu) { ... }<\/tt><tt> \u00a0 private Color(String s, int i) { super(s, i); }<\/tt><\/p>\n<p><tt> \u00a0 publiczny statyczny ko\u0144cowy Kolor CZERWONY;<\/tt><br \/>\n<tt> \u00a0 publiczny statyczny ko\u0144cowy Kolor NIEBIESKI;<\/tt><br \/>\n<tt> \u00a0 publiczny statyczny ko\u0144cowy Kolor ZIELONY;<\/tt><\/p>\n<p><tt> \u00a0 prywatny statyczny ko\u0144cowy Kolor $VALUES[];<\/tt><\/p>\n<p><tt> \u00a0 statyczny {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 CZERWONY = nowy kolor(\"CZERWONY\", 0);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 NIEBIESKI = nowy kolor(\"NIEBIESKI\", 1);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 ZIELONY = nowy kolor(\"ZIELONY\", 2);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 $WARTO\u015aCI = (nowy kolor[] { CZERWONY, NIEBIESKI, ZIELONY });<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Dziedziczenie ma ten skutek, \u017ce <tt> Kolor<\/tt> typ dziedziczy wszystkie metody zaimplementowane w <tt> Wyliczenie&lt;Kolor&gt;<\/tt> .\u00a0 W\u015br\u00f3d nich jest <tt> por\u00f3wnaj<\/tt> metoda.\u00a0 The <tt> Kolor. por\u00f3wnaj<\/tt> metoda powinna prawdopodobnie zaj\u0105\u0107 a <tt> Kolor<\/tt> jako argument.\u00a0 Aby tak si\u0119 sta\u0142o, klasa <tt> Wyliczenie<\/tt> jest og\u00f3lny i <tt> Wylicz.por\u00f3wnajTo<\/tt> metoda trwa <tt> Wyliczenie<\/tt> parametr typu <tt> mi <\/tt> jako argument.\u00a0 W rezultacie wpisz <tt> Kolor<\/tt> pochodz\u0105ce z <tt> Wyliczenie&lt;Kolor&gt;<\/tt> dziedziczy A <tt> por\u00f3wnaj<\/tt> metoda, kt\u00f3ra wymaga a <tt> Kolor<\/tt> i argumentacja, dok\u0142adnie tak, jak powinna.<br \/>\nJe\u015bli przeanalizujemy deklaracj\u0119 \u201e<tt> Enum&lt;E rozszerza Enum&lt;E&gt;&gt;<\/tt> \u201eWidzimy, \u017ce ten wz\u00f3r ma kilka aspekt\u00f3w.<\/p>\n<p>Po pierwsze, zwi\u0105zanym parametrem typu jest sam typ: &#8220;<tt> <b> Wyliczenie<\/b> &lt;E rozszerza si\u0119 <b> Wyliczenie<\/b> &lt;E&gt;&gt;<\/tt> &#8220;. Zapewnia, \u017ce \u200b\u200btylko podtypy typu <tt> Wyliczenie<\/tt> s\u0105 dozwolone jako argumenty typu. (Teoretycznie wpisz <tt> Wyliczenie<\/tt> mo\u017cna utworzy\u0107 instancj\u0119 sam\u0105 w sobie, jak in <tt> Wyliczenie&lt;Enum&gt;<\/tt> , ale z pewno\u015bci\u0105 nie jest to zamierzone i trudno sobie wyobrazi\u0107 sytuacj\u0119, w kt\u00f3rej taka instancja by\u0142aby u\u017cyteczna.)<\/p>\n<p>Po drugie, istnieje fakt, \u017ce typ zwi\u0105zany z parametrami jest typem sparametryzowanym <tt> Wyliczenie<b> &lt;E&gt;<\/b> <\/tt> , kt\u00f3ry u\u017cywa parametru type <tt> mi<\/tt> jako argument typu powi\u0105zania. Ta deklaracja gwarantuje, \u017ce relacja dziedziczenia mi\u0119dzy podtypem a instancj\u0105 <tt> Wyliczenie<\/tt> jest w formie<tt> X rozszerza Enum&lt;X&gt;<\/tt> \u201e. Podtyp taki jak \u201e<tt> X rozszerza Enum&lt;Y&gt;<\/tt> &#8221; nie mo\u017cna zadeklarowa\u0107 ze wzgl\u0119du na argument typu <tt> Y<\/tt> nie mie\u015bci\u0142oby si\u0119 w granicach; tylko podtypy <tt> Wyliczenie&lt;X&gt;<\/tt> mieszcz\u0105 si\u0119 w granicach.<\/p>\n<p>Po trzecie, faktem jest, \u017ce <tt> Wyliczenie<\/tt> ma przede wszystkim charakter og\u00f3lny.\u00a0 Oznacza to, \u017ce niekt\u00f3re metody klasy <tt> Wyliczenie<\/tt> przyj\u0105\u0107 argument lub zwr\u00f3ci\u0107 warto\u015b\u0107 nieznanego typu (lub w inny spos\u00f3b zale\u017ce\u0107 od nieznanego typu). Jak ju\u017c wiemy, ten nieznany typ b\u0119dzie p\u00f3\u017aniej podtypem <tt> X<\/tt> z <tt> Wyliczenie&lt;X&gt;<\/tt> .\u00a0 St\u0105d w typie sparametryzowanym <tt> Wyliczenie&lt;X&gt;<\/tt> , metody te obejmuj\u0105 podtyp <tt> X<\/tt> i s\u0105 dziedziczone do podtypu <tt> X<\/tt> .\u00a0 The <tt> por\u00f3wnaj<\/tt> metoda jest przyk\u0142adem takiej metody; jest dziedziczona z nadklasy do ka\u017cdej podklasy i w ka\u017cdym przypadku ma sygnatur\u0119 specyficzn\u0105 dla podklasy.<\/p>\n<p>Podsumowuj\u0105c, o\u015bwiadczenie \u201e<tt> Enum&lt;E rozszerza Enum&lt;E&gt;&gt;<\/tt> &#8221; mo\u017cna rozszyfrowa\u0107 jako: <tt> Wyliczenie<\/tt> to typ og\u00f3lny, kt\u00f3ry mo\u017cna utworzy\u0107 tylko dla jego podtyp\u00f3w, a te podtypy odziedzicz\u0105 kilka przydatnych metod, z kt\u00f3rych niekt\u00f3re przyjmuj\u0105 argumenty specyficzne dla podtypu (lub w inny spos\u00f3b zale\u017c\u0105 od podtypu).<\/p>\n<p><b>Parametry typu dolnej granicy klas<\/b><\/p>\n<p>Parametry typu mog\u0105 mie\u0107 kilka ogranicze\u0144, np. in <tt> klasa Box&lt;T rozszerza Number&gt; {...}<\/tt> . Ale parametr typu nie mo\u017ce mie\u0107 dolnej granicy, to znaczy konstrukcji takiej jak <tt> klasa Box&lt;T <b> \u015awietnie<\/b> Numer&gt; {...}<\/tt> jest niedozwolone.\u00a0 Dlaczego nie?\u00a0 Odpowied\u017a brzmi: nie ma to sensu, bo nic by nie kupi\u0142o, gdyby by\u0142o dozwolone.\u00a0 Zobaczmy, dlaczego dolna granica parametr\u00f3w typu klas jest myl\u0105ca, badaj\u0105c, co oznacza g\u00f3rna granica parametru typu.<\/p>\n<p>G\u00f3rna granica parametru typu ma trzy skutki:<\/p>\n<ol>\n<ol>\n<li><b> <i> Ograniczona instancja.<\/i> <\/b> G\u00f3rna granica ogranicza zestaw typ\u00f3w, kt\u00f3rych mo\u017cna u\u017cy\u0107 do utworzenia instancji typu og\u00f3lnego.\u00a0 Je\u017celi zadeklarujemy a <tt> klasa Box&lt;T rozszerza Number&gt; {...} <\/tt> wtedy kompilator upewni\u0142by si\u0119, \u017ce tylko podtypy <tt> Numer<\/tt> mo\u017ce by\u0107 u\u017cyty jako argument typu.\u00a0 To znaczy, <tt> Pude\u0142ko&lt;Numer&gt;<\/tt> lub <tt> Pude\u0142ko&lt;D\u0142ugie&gt;<\/tt> jest dozwolone, ale a <tt> Pole&lt;Object&gt;<\/tt> Lub <tt> Pude\u0142ko&lt;String&gt;<\/tt> zosta\u0142oby odrzucone<\/li>\n<\/ol>\n<\/ol>\n<p>Przyk\u0142ad (ograniczonego tworzenia instancji ze wzgl\u0119du na g\u00f3rn\u0105 granic\u0119 parametru typu):<br \/>\n<tt> klasa Box&lt;T rozszerza Number&gt; {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 prywatna warto\u015b\u0107 T;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public Box(T t) { warto\u015b\u0107 = t; }\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }\u00a0<\/tt><tt> pr\u00f3ba klasowa {\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 = nowy Box&lt;Long&gt;(0L);\u00a0\u00a0 <b> \/\/ Cienki<\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Box&lt;String&gt; boxOfString = nowy Box&lt;String&gt;(\"\"); <b> <span style=\"color:#330000;\"> \/\/ b\u0142\u0105d: ci\u0105g znak\u00f3w nie mie\u015bci si\u0119 w granicach<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p>\n<ol>\n<li><b> <i> Dost\u0119p do cz\u0142onk\u00f3w niestatycznych. <\/i> <\/b> G\u00f3rna granica daje dost\u0119p do wszystkich publicznych niestatycznych metod i p\u00f3l g\u00f3rnej granicy.\u00a0 W realizacji naszego <tt> klasa Box&lt;T rozszerza Number&gt; {...}<\/tt> mo\u017cemy wywo\u0142a\u0107 wszystkie publiczne metody niestatyczne zdefiniowane w klasie <tt> Numer<\/tt> , takie jak <tt> intValue()<\/tt> na przyk\u0142ad.\u00a0 Bez g\u00f3rnej granicy kompilator odrzuci\u0142by ka\u017cde takie wywo\u0142anie. Przyk\u0142ad (dost\u0119pu do element\u00f3w niestatycznych ze wzgl\u0119du na g\u00f3rn\u0105 granic\u0119 parametru typu):<\/li>\n<\/ol>\n<p><tt> klasa Box&lt;T rozszerza Number&gt; {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 prywatna warto\u015b\u0107 T;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public Box(T t) { warto\u015b\u0107 = t; }\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public int inkrementacja() { return value.intValue()+1; } <b> \/\/ &lt;= by\u0142oby b\u0142\u0119dem bez ograniczenia liczby<\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }\u00a0<\/tt><\/p>\n<ol>\n<ol>\n<li><b> <i> Wpisz Usu\u0144. <\/i> <\/b> G\u00f3rna granica znajduj\u0105ca si\u0119 najbardziej po lewej stronie s\u0142u\u017cy do usuwania typu i zast\u0119puje parametr type w kodzie bajtowym.\u00a0 w naszym <tt> klasa Box&lt;T rozszerza Number&gt; {...}<\/tt> wszystkie wyst\u0105pienia <tt> T<\/tt> zostanie zast\u0105piona g\u00f3rn\u0105 granic\u0105 <tt> Numer<\/tt> .\u00a0 Na przyk\u0142ad, je\u015bli klasa <tt> Skrzynka<\/tt> ma prywatne pole typu <tt> T<\/tt> i metoda <tt> zestaw pusty (zawarto\u015b\u0107 T) <\/tt> do ustawienia tego pola prywatnego, w\u00f3wczas pole b\u0119dzie typu <tt> Numer<\/tt> po usuni\u0119ciu typu, a metoda zostanie przet\u0142umaczona na metod\u0119 <tt> zestaw pusty (zawarto\u015b\u0107 liczbowa)<\/tt> .<\/li>\n<\/ol>\n<\/ol>\n<p>Przyk\u0142ad (u\u017cycia g\u00f3rnej granicy parametru typu przy kasowaniu typu &#8211; <i> zanim<\/i> usuni\u0119cie typu):<br \/>\n<tt> klasa Box&lt;<b> T rozszerza numer<\/b> &gt; {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 prywatny <b> T<\/b> warto\u015b\u0107;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 skrzynka publiczna(<b> T<\/b> t) { warto\u015b\u0107 = t; }\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }\u00a0<\/tt><\/p>\n<ol>\n<ol>Przyk\u0142ad (u\u017cycia g\u00f3rnej granicy parametru typu przy kasowaniu typu &#8211;<\/ol>\n<\/ol>\n<p><i> Po<\/i><\/p>\n<ol>\n<ol>usuni\u0119cie typu):<\/ol>\n<\/ol>\n<p>&nbsp;<\/p>\n<p><tt> pole klasy {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 prywatny <b> Numer<\/b> warto\u015b\u0107;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 skrzynka publiczna(<b> Numer<\/b> t) { warto\u015b\u0107 = t; }\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p>\n<ol>Ponadto skrajna lewa g\u00f3rna granica pojawia si\u0119 w dalszych lokalizacjach, takich jak automatycznie wstawiane odlewy i metody most\u00f3w.<\/ol>\n<p>Je\u015bli dolne ograniczenia by\u0142yby dozwolone dla parametr\u00f3w typu, jakie skutki uboczne mia\u0142yby lub powinny mie\u0107? Je\u015bli konstrukcja taka jak <tt> klasa Box&lt;T <b> \u015awietnie<\/b> Numer&gt; {...} <\/tt> by\u0142y dozwolone, co by to oznacza\u0142o?\u00a0 Jakie 3 skutki uboczne g\u00f3rnego ograniczenia parametru typu \u2014 ograniczone tworzenie instancji, dost\u0119p do niestatycznego elementu cz\u0142onkowskiego, usuwanie typu \u2014 oznacza\u0142yby dla dolnej granicy?<\/p>\n<p><i> Ograniczone instancje. <\/i> Kompilator mo\u017ce ograniczy\u0107 zestaw typ\u00f3w, kt\u00f3rych mo\u017cna u\u017cy\u0107 do utworzenia instancji typu og\u00f3lnego, za pomoc\u0105 parametru typu dolnej granicy.\u00a0 Na przyk\u0142ad kompilator mo\u017ce zezwoli\u0107 na tworzenie instancji, takich jak <tt> Pude\u0142ko&lt;Numer&gt;<\/tt> I <tt> Pole&lt;Object&gt;<\/tt> z <tt> Pude\u0142ko&lt;T <b> \u015awietnie<\/b> Numer&gt; <\/tt> i odrzucaj instancje takie jak <tt> Pude\u0142ko&lt;D\u0142ugie&gt;<\/tt> Lub <tt> Pude\u0142ko&lt;Short&gt;<\/tt> .\u00a0 By\u0142by to efekt zgodny z restrykcyjnym efektem ubocznym opisanym dla g\u00f3rnych granic parametr\u00f3w typu.<\/p>\n<p><i> Dost\u0119p do cz\u0142onk\u00f3w niestatycznych. <\/i> Dolna granica parametru typu nie daje dost\u0119pu do \u017cadnych konkretnych metod poza tymi odziedziczonymi z klasy <tt> Obiekt<\/tt> . Na przyk\u0142adzie <tt> Pude\u0142ko&lt;T <b> \u015awietnie<\/b> Numer&gt; <\/tt> supertypy <tt> Numer<\/tt> nie maj\u0105 ze sob\u0105 nic wsp\u00f3lnego poza tym, \u017ce s\u0105 typami referencyjnymi, a zatem podtypami <tt> Obiekt<\/tt> .\u00a0 Kompilator nie mo\u017ce za\u0142o\u017cy\u0107, \u017ce pole type <tt> T<\/tt> jest typu <tt> Numer<\/tt> lub jego podtyp.\u00a0 Zamiast tego pole typu <tt> T<\/tt> mo\u017ce by\u0107 dowolnego nadtypu <tt> Numer<\/tt> , takie jak <tt> Mo\u017cliwo\u015b\u0107 serializacji<\/tt> Lub <tt> Obiekt<\/tt> .\u00a0 Wywo\u0142anie metody np <tt> intValue()<\/tt> nie jest ju\u017c bezpieczny dla typu i kompilator musia\u0142by go odrzuci\u0107. W konsekwencji dolna granica parametru typu nie zapewni dost\u0119pu do element\u00f3w niestatycznych poza tymi zdefiniowanymi w klasie <tt> Obiekt<\/tt> i dlatego ma taki sam skutek jak \u201ebez ogranicze\u0144\u201d.<\/p>\n<p><i> Wpisz Usu\u0144<\/i> .\u00a0 Zgodnie z t\u0105 logik\u0105 nie ma sensu zast\u0119powa\u0107 wyst\u0105pie\u0144 parametru type jego doln\u0105 granic\u0105 skrajn\u0105 z lewej strony.\u00a0 Deklarowanie metody takiej jak konstruktor <tt> Skrzynka(<b> T<\/b> T) <\/tt> jako konstruktor <tt> Skrzynka(<b> Numer<\/b> T)<\/tt> nie ma sensu, bior\u0105c to pod uwag\u0119 <tt> T<\/tt> zostaje zast\u0105piony nadtypem <tt> Numer<\/tt> .\u00a0 Jaki\u015b <tt> Obiekt<\/tt> mo\u017cna s\u0142usznie przekaza\u0107 konstruktorowi w jednej instancji <tt> Pole&lt;Object&gt;<\/tt> i konstruktor by to odrzuci\u0142.\u00a0 To by\u0142oby ca\u0142kowicie b\u0142\u0119dne.\u00a0\u00a0 Zatem usuni\u0119cie typu zast\u0105pi\u0142oby wszystkie wyst\u0105pienia zmiennej typu<tt> T<\/tt> wed\u0142ug typu <tt> Obiekt<\/tt> , a nie jego doln\u0105 granic\u0119.\u00a0 Ponownie dolna granica mia\u0142aby taki sam skutek jak \u201ebrak ograniczenia\u201d.<\/p>\n<p>Czy chcesz dowiedzie\u0107 si\u0119, co by to oznacza\u0142o, gdyby oba by\u0142y ni\u017csze <i> _I_<\/i> g\u00f3rne granice by\u0142y dozwolone?\u00a0\u00a0 Osobi\u015bcie nawet nie chc\u0119 o tym my\u015ble\u0107 i wola\u0142bym umie\u015bci\u0107 to w kategorii \u201enie do zarz\u0105dzania\u201d, je\u015bli pozwolisz.<\/p>\n<p>Konkluzja jest taka: wszystko to \u201e<tt> \u015awietnie<\/tt> \u201eograniczony by ci\u0119 kupi\u0142\u201d to ograniczenie, kt\u00f3re dotyczy tylko supertyp\u00f3w <tt> Numer<\/tt> mog\u0105 by\u0107 u\u017cywane jako argumenty typu.\u00a0 A nawet to cz\u0119sto jest \u017ale rozumiane.\u00a0 NIE oznacza\u0142oby to tego <tt> klasa Box&lt;T super Numer&gt; {...}<\/tt> zawiera tylko wyst\u0105pienia nadtyp\u00f3w <tt> Numer<\/tt> .\u00a0 Wr\u0119cz odwrotnie \u2013 jak pokazuje poni\u017cszy przyk\u0142ad!<\/p>\n<p>Przyk\u0142ad (u\u017cycia g\u00f3rnej granicy parametru typu przy kasowaniu typu &#8211; <i> zanim<\/i> usuni\u0119cie typu):<\/p>\n<div style=\"margin-left:40px;\">\n<blockquote><p><tt> klasa Box&lt;<b> T super liczba<\/b> &gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0 prywatny <b> T<\/b> warto\u015b\u0107;<\/tt><br \/>\n<tt> \u00a0\u00a0 skrzynka publiczna(<b> T<\/b> t) { warto\u015b\u0107 = t; }<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<\/div>\n<p>Przyk\u0142ad (u\u017cycia g\u00f3rnej granicy parametru typu przy kasowaniu typu &#8211; <i> Po<\/i> usuni\u0119cie typu):<\/p>\n<div style=\"margin-left:40px;\">\n<blockquote><p><tt> pole klasy {<\/tt><br \/>\n<tt> \u00a0\u00a0 prywatny <b> Obiekt<\/b> warto\u015b\u0107;<\/tt><br \/>\n<tt> \u00a0\u00a0 skrzynka publiczna(<b> Obiekt<\/b> t) { warto\u015b\u0107 = 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> \u015awietnie<\/b> Numer&gt; {...} <\/tt> zostanie przet\u0142umaczony przez usuni\u0119cie typu na a <tt> Skrzynka<\/tt> zawieraj\u0105cy <tt> Obiekt<\/tt> pole i jego konstruktor zostanie przet\u0142umaczony na <tt> Pude\u0142ko (obiekt t)<\/tt> . To zasadniczo r\u00f3\u017cni si\u0119 od <tt> klasa Box&lt;T <b> rozci\u0105ga si\u0119<\/b> Numer&gt; {...}<\/tt> , co by\u0142oby przet\u0142umaczone na a <tt> Skrzynka<\/tt> zawieraj\u0105cy A <tt> Numer<\/tt> pole i jego konstruktor zostanie przet\u0142umaczony na <tt> Pude\u0142ko (liczba t)<\/tt> . W zwi\u0105zku z tym A <tt> Pude\u0142ko&lt;Numer&gt;<\/tt> utworzone z a<tt> klasa Box&lt;T rozszerza Number&gt; {...}<\/tt> r\u00f3\u017cni\u0142oby si\u0119 od A <tt> Pude\u0142ko&lt;Numer&gt;<\/tt> instancja z a <tt> klasa Box&lt;T super Numer&gt; {...}<\/tt> , co mo\u017ce powodowa\u0107 zamieszanie.\u00a0 Z tego powodu dolne granice nie maj\u0105 sensu w przypadku parametr\u00f3w typu klas.<\/p>\n<p>&nbsp;<\/p>\n<hr width=\"100%\" \/>\n<p>&nbsp;<\/p>\n<p><b>Parametry typu dolnej granicy metod<\/b><\/p>\n<p>W po\u0142\u0105czeniu z metodami i ich typami argument\u00f3w czasami przydatny mo\u017ce by\u0107 parametr typu z doln\u0105 granic\u0105.<\/p>\n<p>Przyk\u0142ad (metody, w kt\u00f3rej przyda\u0142by si\u0119 parametr typu z doln\u0105 granic\u0105):<\/p>\n<blockquote><p><tt> klasa Para&lt;X,Y&gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0 najpierw prywatny X;<\/tt><br \/>\n<tt> \u00a0\u00a0 prywatny Y drugi;<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> \u00a0\u00a0 publiczny &lt;<b> Super X<\/b> ,<b> B super Y<\/b> &gt; B addToMap(Map&lt;A,B&gt; map) { \/\/ b\u0142\u0105d: parametr typu nie mo\u017ce mie\u0107 dolnej granicy<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 return map.put(pierwszy, drugi);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> pr\u00f3ba klasowa {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public static void main(String[] args) {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Para&lt;String,Long&gt; para = nowa para&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 Liczba liczba = pair.addToMap(map);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>The <tt> dodajDoMapy()<\/tt> Metoda dodaje zawarto\u015b\u0107 pary do mapy.\u00a0 Dowolna mapa, kt\u00f3ra mo\u017ce przechowywa\u0107 supertypy <tt> X<\/tt> I <tt> Y<\/tt> zrobi\u0142by.\u00a0 Mapa <tt> umie\u015bci\u0107()<\/tt> Metoda zwraca warto\u015b\u0107 znalezion\u0105 na mapie dla danego klucza, je\u015bli istnieje ju\u017c wpis klucz-warto\u015b\u0107 dla klucza na mapie.\u00a0 Warto\u015b\u0107 zwracana przez map\u0119 <tt> umie\u015bci\u0107()<\/tt> metoda zostanie zwr\u00f3cona z metody <tt> dodajDoMapy()<\/tt> metoda.\u00a0 W tych okoliczno\u015bciach nale\u017ca\u0142oby zadeklarowa\u0107 metod\u0119 jak pokazano powy\u017cej: Mapa jest sparametryzowana nadtypami parametr\u00f3w typu pary i <tt> dodajDoMapy()<\/tt> Typ zwracany przez metod\u0119 jest typem warto\u015bci mapy.<\/p>\n<p>Poniewa\u017c kompilator nie pozwala na dolne ograniczenia parametr\u00f3w typu, potrzebujemy obej\u015bcia.<\/p>\n<p>Jednym z rozwi\u0105za\u0144, kt\u00f3re przychodzi na my\u015bl, jest u\u017cycie symboli wieloznacznych, poniewa\u017c symbole wieloznaczne mog\u0105 mie\u0107 doln\u0105 granic\u0119.\u00a0 Oto obej\u015bcie problemu z u\u017cyciem symbolu wieloznacznego.<\/p>\n<p>Przyk\u0142ad (obej\u015bcia poprzedniego przyk\u0142adu przy u\u017cyciu symboli wieloznacznych):<\/p>\n<blockquote><p><tt> klasa Para&lt;X,Y&gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0 najpierw prywatny X;<\/tt><br \/>\n<tt> \u00a0\u00a0 prywatny Y drugi;<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> \u00a0\u00a0 publiczny <b> Obiekt<\/b> addToMap(Map&lt;<b> ? SuperX<\/b> , <b> ? super Y<\/b> mapa &gt;) {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 return map.put(pierwszy, drugi);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> pr\u00f3ba klasowa {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public static void main(String[] args) {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Para&lt;String,Long&gt; para = nowa para&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 Liczba liczba = <b> (Numer)<\/b> pair.addToMap(mapa);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Dzia\u0142a, z t\u0105 r\u00f3\u017cnic\u0105, \u017ce nie ma mo\u017cliwo\u015bci zadeklarowania \u017c\u0105danego typu zwrotu.\u00a0 By\u0142by to supertyp <tt> Y<\/tt> kt\u00f3ry kompilator przechwytuje z typu mapy, ale nie ma sk\u0142adni umo\u017cliwiaj\u0105cej jego okre\u015blenie.\u00a0 Nie mo\u017cemy deklarowa\u0107 typu zwrotu \u201e<tt> ? super Y<\/tt> &#8220;, poniewa\u017c &#8220;<tt> ? super Y<\/tt> &#8221; jest symbolem wieloznacznym, a nie typem i dlatego nie jest dozwolony jako typ zwracany. Nie mamy wyboru i musimy go u\u017cy\u0107 <tt> Obiekt<\/tt> zamiast tego jako typ zwracany przez nasz\u0105 metod\u0119.\u00a0 Ten raczej niespecyficzny typ powrotu wymusza z kolei wywo\u0142anie metody <tt> dodajDoMapy()<\/tt> metod\u0119 na rzutowanie warto\u015bci zwracanej w d\u00f3\u0142 <tt> Obiekt<\/tt> do jego rzeczywistego typu.\u00a0 To nie jest dok\u0142adnie to, co mieli\u015bmy na my\u015bli.<\/p>\n<p>Innym obej\u015bciem jest u\u017cycie metod statycznych.\u00a0 Oto obej\u015bcie z metod\u0105 statyczn\u0105 zamiast metody niestatycznej.<\/p>\n<p>Przyk\u0142ad (obej\u015bcia poprzedniego przyk\u0142adu przy u\u017cyciu metody statycznej):<\/p>\n<blockquote><p><tt> klasa Para&lt;X,Y&gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0 najpierw prywatny X;<\/tt><br \/>\n<tt> \u00a0\u00a0 prywatny Y drugi;<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> \u00a0\u00a0 publiczny <b> statyczny<\/b> &lt;<b> A<\/b> ,<b> B<\/b> ,X <b> rozci\u0105ga A<\/b> ,Y <b> rozci\u0105ga B<\/b> &gt; B addToMap (para&lt;X, para Y&gt;, Map&lt;<b> A<\/b> ,<b> B<\/b> mapa &gt;) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 return map.put(para.pierwsza, para.sekunda);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> pr\u00f3ba klasowa {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public static void main(String[] args) {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Para&lt;String,Long&gt; para = nowa para&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 Liczba liczba = <b> Para<\/b> .addToMap(<b> para<\/b> ,mapa);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Og\u00f3lny <tt> dodajDoMapy()<\/tt> metoda ma cztery parametry typu: dwa symbole zast\u0119pcze <tt> X<\/tt> I <tt> Y<\/tt> dla typu pary i dw\u00f3ch symboli zast\u0119pczych <tt> A<\/tt> I <tt> B <\/tt> dla typu mapy. <tt> A<\/tt> I <tt> B<\/tt> s\u0105 supertypami <tt> X<\/tt> I <tt> Y<\/tt> , poniewa\u017c <tt> X<\/tt> I <tt> Y<\/tt> \u00a0 s\u0105 zadeklarowane z <tt> A<\/tt> I <tt> B<\/tt> jako ich g\u00f3rne granice. (Zauwa\u017c, \u017ce parametry typu metody og\u00f3lnej <tt> X<\/tt> I <tt> Y<\/tt> nie maj\u0105 nic wsp\u00f3lnego z <tt> Para<\/tt> klasa <tt> X<\/tt> I <tt> Y<\/tt> parametry.\u00a0 Imiona <tt> X<\/tt> I <tt> Y<\/tt> s\u0105 ponownie wykorzystywane w metodzie og\u00f3lnej, aby by\u0142y \u0142atwo rozpoznawalne jako parametry typu pary. U\u017cywaj\u0105c czterech parametr\u00f3w typu, mo\u017cemy zadeklarowa\u0107 dok\u0142adny typ zwracany wed\u0142ug potrzeb: jest to ten sam typ, co typ warto\u015bci mapy.<\/p>\n<p>Przyk\u0142ad (nielegalnego u\u017cycia parametru typu w kontek\u015bcie statycznym klasy og\u00f3lnej):<\/p>\n<blockquote><p><tt> klasa SomeClass<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> inicjator statyczny, pole statyczne, metoda statyczna<\/i><br \/>\n<tt> \u00a0 <b> statyczny<\/b> {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 SomeClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> Test &gt; = nowa SomeClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> &gt;(); <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 prywatny <b> statyczny<\/b> <b> <span style=\"color:#000099;\"> T<\/span> <\/b> Informacje globalne;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 publiczny\u00a0 <b> statyczny<\/b> <b> <span style=\"color:#000099;\"> T <\/span> <\/b> getGlobalInfo() {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 zwr\u00f3\u0107 informacje globalne;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> inicjator niestatyczny, pole niestatyczne, metoda niestatyczna<\/i><br \/>\n<tt> \u00a0 {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 SomeClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> Test &gt; = nowa SomeClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> &gt;();<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 prywatny\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#000099;\"> T<\/span> <\/b> informacje lokalne;<\/tt><br \/>\n<tt> \u00a0 publiczny\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 zwr\u00f3\u0107 informacje lokalne;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> statyczne typy zagnie\u017cd\u017cone<\/i><br \/>\n<tt> \u00a0 publiczny <b> statyczny<\/b> <b> klasa<\/b> Awaria rozszerza wyj\u0105tek {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 prywatny fina\u0142 <b> <span style=\"color:#000099;\"> T<\/span> <\/b> informacje;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 publiczna awaria (<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) { informacja = t; }\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 publiczny <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getInfo() { zwr\u00f3\u0107 informacj\u0119; }\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 prywatny <b> interfejs<\/b> Mo\u017cliwo\u015b\u0107 kopiowania {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 <b> <span style=\"color:#000099;\"> T<\/span> <\/b> kopia();\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;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 prywatny <b> wyliczenie<\/b> Pa\u0144stwo {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 WA\u017bNE, NIEWA\u017bNE;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 prywatny <b> <span style=\"color:#000099;\"> T<\/span> <\/b> informacje; \/\/ b\u0142\u0105d<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 publiczna informacja o pustym zestawie(<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) { informacja = t; } <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 publiczny <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getInfo() { zwr\u00f3\u0107 informacj\u0119; }\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> niestatyczne typy zagnie\u017cd\u017cone<\/i><br \/>\n<tt> \u00a0 publiczny <b> klasa<\/b> Akcesor {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 publiczny <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getInfo() { zwr\u00f3\u0107 informacje lokalne; }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Przyk\u0142ad ilustruje, \u017ce parametru type nie mo\u017cna u\u017cy\u0107 w kontek\u015bcie statycznym klasy og\u00f3lnej.\u00a0 Pokazuje r\u00f3wnie\u017c, \u017ce zagnie\u017cd\u017cone interfejsy i typy wyliczeniowe s\u0105 uwa\u017cane za elementy statyczne klasy.\u00a0 Tylko klasy wewn\u0119trzne, czyli niestatyczne klasy zagnie\u017cd\u017cone, mog\u0105 u\u017cywa\u0107 parametru type otaczaj\u0105cej klasy og\u00f3lnej.<\/p>\n<p>Zakres parametru typu interfejsu to ca\u0142a definicja interfejsu, z wyj\u0105tkiem wszelkich p\u00f3l i typ\u00f3w zagnie\u017cd\u017conych.\u00a0 Dzieje si\u0119 tak, poniewa\u017c pola i typy zagnie\u017cd\u017cone zdefiniowane w interfejsie s\u0105 domy\u015blnie statyczne.<\/p>\n<p>Przyk\u0142ad (nielegalnego u\u017cycia parametru type w interfejsie og\u00f3lnym):<\/p>\n<blockquote><p><tt> interfejs SomeInterface<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> pole<\/i><br \/>\n<tt> \u00a0 SomeClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> Warto\u015b\u0107 &gt; = nowa SomeClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> &gt;();\u00a0 <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> typ zagnie\u017cd\u017cony<\/i><br \/>\n<tt> \u00a0 <b> klasa<\/b> Akcesor {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 publiczny <b> <span style=\"color:#000099;\"> T <\/span> <\/b> pobierzInfo() {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/ b\u0142\u0105d<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 zwr\u00f3\u0107 warto\u015b\u0107.getGlobalInfo();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> metody<\/i><br \/>\n<tt> \u00a0 <b> <span style=\"color:#000099;\"> T<\/span> <\/b> pobierzWarto\u015b\u0107();<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Przyk\u0142ad pokazuje, \u017ce pola interfejsu s\u0105 domy\u015blnie statyczne, wi\u0119c parametru type nie mo\u017cna u\u017cy\u0107 w \u017cadnym miejscu w deklaracji pola interfejsu og\u00f3lnego.\u00a0 Podobnie klasa zagnie\u017cd\u017cona jest uwa\u017cana za statyczn\u0105 klas\u0119 zagnie\u017cd\u017con\u0105, a nie klas\u0119 wewn\u0119trzn\u0105 i z tego powodu u\u017cycie parametru type w dowolnym miejscu klasy zagnie\u017cd\u017conej jest nielegalne.<\/p>\n<p><b> <i> Obej\u015bcie dla zagnie\u017cd\u017conych klas statycznych i interfejs\u00f3w:<\/i> <\/b><\/p>\n<p>W przypadku statycznie zagnie\u017cd\u017conych klas i interfejs\u00f3w nie jest to powa\u017cna katastrofa.\u00a0 Jako obej\u015bcie mo\u017cemy wygenerowa\u0107 klas\u0119 statyczn\u0105 lub sam interfejs.<\/p>\n<p>Przyk\u0142ad (obej\u015bcie &#8211; wygeneruj zagnie\u017cd\u017cony typ statyczny):<\/p>\n<blockquote><p><tt> Opakowanie klasy<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 prywatny fina\u0142 <b> <span style=\"color:#000099;\"> T<\/span> <\/b> Obiekt;<\/tt><\/p><\/blockquote>\n<blockquote><p><tt> \u00a0 opakowanie publiczne (<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) {Obiekt = t; }<\/tt><br \/>\n<tt> \u00a0 publiczny <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getWrapper() { zwr\u00f3\u0107 obiekt; }<\/tt><tt> \u00a0 publiczny Niezmienny<b> &lt;T&gt;<\/b> makeImmutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 zwr\u00f3\u0107 nowy Niezmienny<b> &lt;T&gt;<\/b> (Obiekt);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 publiczny Zmienny<b> &lt;T&gt;<\/b> makeMutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 zwr\u00f3\u0107 nowy Mutable<b> &lt;T&gt;<\/b> (Obiekt);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 prywatny statyczny &lt;A&gt; A makeClone(A theObject) { ... }<\/tt><\/p>\n<p><tt> \u00a0 publiczna statyczna klasa ko\u0144cowa Niezmienna<b> &lt;A&gt;<\/b> { <b> \/\/ jest teraz klas\u0105 og\u00f3ln\u0105<\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 prywatny fina\u0142 <b> A<\/b> Obiekt;<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 publiczny Niezmienny (<b> A<\/b> argument) {<\/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 publiczny <b> A<\/b> getWrappedItem() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 zwr\u00f3\u0107 makeClone(obiekt);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 publiczna klasa statyczna Mutable<b> &lt;A&gt;<\/b> {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ... podobny ...<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Nie ma takiego obej\u015bcia dla zagnie\u017cd\u017conych typ\u00f3w wyliczeniowych, poniewa\u017c nie mog\u0105 one by\u0107 og\u00f3lne.<\/p>\n<p><b> <i> Obej\u015bcie dla zagnie\u017cd\u017conych klas statycznych:<\/i> <\/b><\/p>\n<p>Je\u015bli zagnie\u017cd\u017conym typem statycznym jest klasa, alternatywnym obej\u015bciem by\u0142oby przekszta\u0142cenie klasy statycznej w niestatyczn\u0105 klas\u0119 wewn\u0119trzn\u0105.<\/p>\n<p>Przyk\u0142ad (obej\u015bcie &#8211; u\u017cyj klasy wewn\u0119trznej):<\/p>\n<blockquote><p><tt> Opakowanie klasy<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 prywatny fina\u0142 <b> <span style=\"color:#000099;\"> T<\/span> <\/b> Obiekt;<\/tt><\/p><\/blockquote>\n<blockquote><p><tt> \u00a0 opakowanie publiczne (<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) {Obiekt = t; }<\/tt><br \/>\n<tt> \u00a0 publiczny <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getWrapper() { zwr\u00f3\u0107 obiekt; }<\/tt><tt> \u00a0 public Mutable makeMutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 powr\u00f3t <b> Ten.<\/b> nowy Mutable(theObject);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 public Niezmienna makeImmutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 powr\u00f3t <b> Ten.<\/b> nowy Niezmienny(obiekt);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 prywatny statyczny &lt;A&gt; A makeClone(A theObject) { ... }<\/tt><\/p>\n<p><tt> \u00a0 publiczna klasa ko\u0144cowa Niezmienny {\u00a0 <b> \/\/ nie jest ju\u017c klas\u0105 statyczn\u0105<\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 prywatny fina\u0142 <b> T<\/b> Obiekt;<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0\u00a0\u00a0 publiczny Niezmienny (<b> T<\/b> argument) {<\/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 publiczny <b> T<\/b> getWrappedItem() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 zwr\u00f3\u0107 makeClone(obiekt);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 klasa publiczna Mutable\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ... podobny ...<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>To obej\u015bcie wi\u0105\u017ce si\u0119 z pewnym obci\u0105\u017ceniem, poniewa\u017c wszystkie klasy wewn\u0119trzne maj\u0105 ukryte odniesienie do instancji typu zewn\u0119trznego, kt\u00f3rego w tym przyk\u0142adzie nie potrzebuj\u0105 ani z kt\u00f3rego nie korzystaj\u0105; ukryte odniesienie to tylko baga\u017c.\u00a0 Cz\u0119sto klasy wewn\u0119trzne s\u0105 \u0142\u0105czone z interfejsami, aby klasa wewn\u0119trzna by\u0142a prywatnym szczeg\u00f3\u0142em implementacji klasy otaczaj\u0105cej.\u00a0 Tutaj mo\u017cemy zrobi\u0107 to samo.<\/p>\n<p>Przyk\u0142ad (poprawione poprzednie obej\u015bcie):<\/p>\n<blockquote><p><tt> Opakowanie klasy<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 prywatny fina\u0142 <b> <span style=\"color:#000099;\"> T<\/span> <\/b> Obiekt;<\/tt><\/p><\/blockquote>\n<blockquote><p><tt> \u00a0 opakowanie publiczne (<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) {Obiekt = t; }<\/tt><br \/>\n<tt> \u00a0 publiczny <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getWrapper() { zwr\u00f3\u0107 obiekt; }<\/tt><tt> \u00a0 publiczny Zmienny<b> &lt;T&gt;<\/b> makeMutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 zwr\u00f3\u0107 to.new Mutable(theObject);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 publiczny Niezmienny<b> &lt;T&gt;<\/b> makeImmutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 zwr\u00f3\u0107 to.new Niezmienny(obiekt);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 prywatny statyczny &lt;A&gt; A makeClone(A theObject) { ... }<\/tt><\/p>\n<p><tt> \u00a0 <b> interfejs publiczny <\/b> Niezmienny&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> interfejs publiczny <\/b> Mutable&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> prywatny<\/b> klasa ko\u0144cowa ImmutableImplementation <b> implementuje Immutable&lt;T&gt;<\/b> {\u00a0<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0\u00a0\u00a0 prywatny fina\u0142 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 publiczny T getWrappedItem() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 zwr\u00f3\u0107 makeClone(obiekt);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 <b> prywatny<\/b> klasa MutableImplementation <b> implementuje Mutable&lt;T&gt;<\/b> {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ... podobny ...<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Jak wida\u0107, zagnie\u017cd\u017cone interfejsy publiczne musz\u0105 by\u0107 og\u00f3lne, podczas gdy wewn\u0119trzne klasy prywatne mog\u0105 u\u017cywa\u0107 parametru typu otaczaj\u0105cej je klasy.<\/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>Aby objektiv wi\u0119cej informacji, zobacz cz\u0119sto zadawane pytania: <a href=\"http:\/\/www.angelikalanger.com\/GenericsFAQ\/JavaGenericsFAQ.html#SECTION1\" rel=\"nofollow\">http:\/\/www.angelikalanger.com\/GenericsFAQ\/JavaGenericsFAQ.html#SECTION1<\/a> Oto w skr\u00f3cie kilka viz\u0105gch poynt\u0105 z tego FAQ. Przysklad (typu g\u00f3\u0142nego): klasa Para&lt;X,Y&gt; {\u00a0 \u00a0 pierwszy prywatny X; \u00a0 prywatny Y drugi; \u00a0 publiczna Para(X a1, Y a2) { \u00a0\u00a0\u00a0 pierwszy = a1; \u00a0\u00a0\u00a0 sekunda = a2; \u00a0 } \u00a0 public X getFirst() { napierw [&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-jawa","tag-leki-generyczne","tag-jawa-2","tag-generyczne-java"],"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 Sob\u00f3r Powszechny w Konstantynopolu (381) \u2013 potwierdzenie nauki o Duchu \u015awi\u0119tym","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;Artyku\u0142y po\u015bwi\u0119cone Biblii oraz duchowi i cia\u0142u&quot;","block_context":{"text":"Artyku\u0142y po\u015bwi\u0119cone Biblii oraz duchowi i cia\u0142u","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":"Pi\u0105ty Sob\u00f3r Ekumeniczny w Konstantynopolu (553): Sp\u00f3r trzech g\u0142\u00f3w, dziedzictwo teologiczne Chalcedonu i polityka cesarza Justyniana 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;Artyku\u0142y po\u015bwi\u0119cone Biblii oraz duchowi i cia\u0142u&quot;","block_context":{"text":"Artyku\u0142y po\u015bwi\u0119cone Biblii oraz duchowi i cia\u0142u","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":"M\u00f3j pogl\u0105d na Boga, Bibli\u0119 i Chrystusa","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;Artyku\u0142y po\u015bwi\u0119cone Biblii oraz duchowi i cia\u0142u&quot;","block_context":{"text":"Artyku\u0142y po\u015bwi\u0119cone Biblii oraz duchowi i cia\u0142u","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":"Dla Boga i Wszech\u015bwiata","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;Artyku\u0142y po\u015bwi\u0119cone Biblii oraz duchowi i cia\u0142u&quot;","block_context":{"text":"Artyku\u0142y po\u015bwi\u0119cone Biblii oraz duchowi i cia\u0142u","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":"Sob\u00f3r Ekumeniczny III w Efezie (431): sp\u00f3r chrystologiczny pomi\u0119dzy Cyrylem Aleksandryjskim a Nestoriuszem a potwierdzenie nauki o Matce Bo\u017cej","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;Artyku\u0142y po\u015bwi\u0119cone Biblii oraz duchowi i cia\u0142u&quot;","block_context":{"text":"Artyku\u0142y po\u015bwi\u0119cone Biblii oraz duchowi i cia\u0142u","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":"Sz\u00f3sty Sob\u00f3r Ekumeniczny w Konstantynopolu (680\u2013681): pot\u0119pienie monoteletyzmu i afirmacja dw\u00f3ch woli i dw\u00f3ch czyn\u00f3w w Jezusie Chrystusie","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;Artyku\u0142y po\u015bwi\u0119cone Biblii oraz duchowi i cia\u0142u&quot;","block_context":{"text":"Artyku\u0142y po\u015bwi\u0119cone Biblii oraz duchowi i cia\u0142u","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}]}}