{"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":"Gen\u00e9ricos Java explicados resumidamente com exemplos"},"content":{"rendered":"<p>Consulte estas perguntas frequentes para obter mais informa\u00e7\u00f5es:<\/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>Aqui resumimos alguns pontos importantes deste FAQ.<\/p>\n<p>Exemplo (de tipo gen\u00e9rico):<\/p>\n<blockquote><p><tt> classe Par&lt;X,Y&gt; {\u00a0<\/tt><br \/>\n<tt> \u00a0 privado X primeiro;<\/tt><br \/>\n<tt> \u00a0 privado Y segundo;<\/tt><tt> \u00a0 public par (X a1, Y a2) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 primeiro = a1;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 segundo = a2;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 public X getFirst() { return first; }<\/tt><br \/>\n<tt> \u00a0 public Y getSegundo() { return segundo; }<\/tt><br \/>\n<tt> \u00a0 public void setFirst(X arg)\u00a0 { primeiro = arg; }<\/tt><br \/>\n<tt> \u00a0 public void setSecond(Y arg) { segundo = arg; }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>A aula <tt> Par<\/tt> tem dois par\u00e2metros de tipo <tt> X <\/tt> e <tt> S<\/tt> .\u00a0 S\u00e3o substitu\u00eddos por argumentos de tipo quando o tipo gen\u00e9rico <tt> Par<\/tt> \u00e9 instanciado. Por exemplo, na declara\u00e7\u00e3o <tt> Par&lt;String, Data&gt;<\/tt> O par\u00e2metro de tipo <tt> X<\/tt> \u00e9 substitu\u00eddo pelo argumento de tipo <tt> Corda<\/tt> e <tt> S<\/tt> \u00e9 substitu\u00eddo por\u00a0 <tt> Data<\/tt> .<br \/>\nO \u00e2mbito dos identificadores <tt> X <\/tt> e <tt> S<\/tt> \u00e9<b> <i> <\/i> <\/b> toda a defini\u00e7\u00e3o da classe.\u00a0 Neste \u00e2mbito os dois par\u00e2metros de tipo <tt> X <\/tt> e <tt> S<\/tt> s\u00e3o utilizados como se fossem tipos (com algumas restri\u00e7\u00f5es). No exemplo acima, os par\u00e2metros de tipo s\u00e3o utilizados como argumento e tipo de retorno dos m\u00e9todos de inst\u00e2ncia e dos tipos de campos de inst\u00e2ncia.<br \/>\nOs par\u00e2metros de tipo podem ser declarados com limites. Os limites d\u00e3o acesso a m\u00e9todos do tipo desconhecido que o par\u00e2metro de tipo representa. No nosso exemplo, n\u00e3o invocamos nenhum m\u00e9todo dos tipos desconhecidos <tt> X <\/tt> e <tt> S<\/tt> . Por este motivo, os dois par\u00e2metros de tipo s\u00e3o ilimitados.<\/p>\n<p>Exemplo (de um tipo parametrizado concreto):<\/p>\n<blockquote><p><tt> public void imprimePair(<b> <span style=\"color:#000099;\"> Par&lt;String,Long&gt;<\/span> <\/b> par) {<\/tt><br \/>\n<tt> \u00a0 System.out.println(\"(\"+pair.getFirst()+\",\"+pair.getSecond()+\")\");<\/tt><br \/>\n<tt> }<\/tt><tt> <b> <span style=\"color:#000099;\"> Par&lt;String,Long&gt;<\/span> <\/b> limite = novo <b> <span style=\"color:#000099;\"> Par&lt;String,Long&gt;<\/span> <\/b> (\"m\u00e1ximo\",1024L);<\/tt><br \/>\n<tt> printPair(limite);<\/tt><\/p><\/blockquote>\n<p>Exemplo (de um tipo wildcard parametrizado):<\/p>\n<blockquote>\n<blockquote><p><tt> public void imprimePair(<b> <span style=\"color:#000099;\"> Par&lt;?,?&gt;<\/span> <\/b> par) {<\/tt><br \/>\n<tt> \u00a0 System.out.println(\"(\"+pair.getFirst()+\",\"+pair.getSecond()+\")\");<\/tt><br \/>\n<tt> }<\/tt><tt> <b> <span style=\"color:#000099;\"> Par&lt;?,?&gt;<\/span> <\/b> limite = novo <b> <span style=\"color:#000099;\"> Par&lt;String,Long&gt;<\/span> <\/b> (\"m\u00e1ximo\",1024L);<\/tt><br \/>\n<tt> printPair(limite);<\/tt><\/p><\/blockquote>\n<\/blockquote>\n<p>Todas as instancia\u00e7\u00f5es de um tipo gen\u00e9rico partilham a mesma representa\u00e7\u00e3o do tipo de tempo de execu\u00e7\u00e3o, ou seja, a representa\u00e7\u00e3o do tipo bruto. Por exemplo, as instancia\u00e7\u00f5es de um tipo gen\u00e9rico <tt> Lista<\/tt> , como <tt> Lista&lt;Data&gt;<\/tt> , <tt> Lista&lt;String&gt;<\/tt> , <tt> Lista&lt;Long&gt;<\/tt> , etc. t\u00eam tipos est\u00e1ticos diferentes em tempo de compila\u00e7\u00e3o, mas o mesmo tipo din\u00e2mico <tt> Lista <\/tt> em tempo de execu\u00e7\u00e3o.<\/p>\n<p>Um elenco \u00e9 constitu\u00eddo por duas partes:<\/p>\n<ul>\n<li>uma verifica\u00e7\u00e3o est\u00e1tica de tipo realizada pelo compilador em tempo de compila\u00e7\u00e3o e<\/li>\n<li>uma verifica\u00e7\u00e3o din\u00e2mica de tipo realizada pela m\u00e1quina virtual em tempo de execu\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>A parte est\u00e1tica classifica as conjura\u00e7\u00f5es sem sentido, que n\u00e3o podem ter sucesso, como a conjura\u00e7\u00e3o de <tt> Corda<\/tt> que <tt> Data<\/tt> ou de <tt> Lista&lt;String&gt;<\/tt> que <tt> Lista&lt;Data&gt;<\/tt> .<\/p>\n<p>A parte din\u00e2mica utiliza a informa\u00e7\u00e3o do tipo de tempo de execu\u00e7\u00e3o e executa uma verifica\u00e7\u00e3o de tipo em tempo de execu\u00e7\u00e3o.\u00a0 Isto levanta um <tt> ClassCastException<\/tt> se o tipo din\u00e2mico do objeto n\u00e3o for o tipo de destino (ou um subtipo do tipo de destino) da convers\u00e3o. Exemplos de moldes com parte din\u00e2mica s\u00e3o os moldes de <tt> Objeto<\/tt> que <tt> Corda<\/tt> ou de <tt> Objeto<\/tt> que <tt> Lista&lt;String&gt;<\/tt> .\u00a0 S\u00e3o os chamados downcasts, de um supertipo at\u00e9 um subtipo.<\/p>\n<p>Exemplos de tipos parametrizados concretos s\u00e3o <tt> Lista&lt;String&gt;<\/tt> , <tt> Mapa&lt;String,Data&gt;<\/tt> , mas n\u00e3o <tt> Lista&lt;? estende o n\u00famero&gt;<\/tt> ou <tt> Mapa&lt;String,?&gt;<\/tt> .<\/p>\n<p>Por vezes espera-se que um <tt> Lista&lt;Object&gt;<\/tt> seria um supertipo de um <tt> Lista&lt;String&gt;<\/tt> , porque <tt> Objeto<\/tt> \u00e9 um supertipo de <tt> Corda<\/tt> .\u00a0 Esta expectativa decorre do facto de existir tal tipo de rela\u00e7\u00e3o para arrays:\u00a0 <tt> Objeto[]<\/tt> \u00e9 um supertipo de <tt> Corda[]<\/tt> , porque <tt> Objeto<\/tt> \u00e9 um supertipo de <tt> Corda<\/tt> . (Este tipo de relacionamento \u00e9 conhecido como <i> covari\u00e2ncia<\/i> .) A rela\u00e7\u00e3o de supersubtipo dos tipos de componentes estende-se aos tipos de array correspondentes. N\u00e3o existe tal rela\u00e7\u00e3o de tipo para instancia\u00e7\u00f5es de tipos gen\u00e9ricos. (Tipos parametrizados s\u00e3o <i> n\u00e3o<\/i> covariante.)<\/p>\n<p>A falta de uma rela\u00e7\u00e3o de supersubtipo entre instancia\u00e7\u00f5es do mesmo tipo gen\u00e9rico tem v\u00e1rias consequ\u00eancias.\u00a0 Aqui est\u00e1 um exemplo.<\/p>\n<p>Exemplo:<\/p>\n<p><tt> void printAll(ArrayList&lt;Object&gt; c) {<\/tt><br \/>\n<tt> \u00a0 para (Objecto o: c)\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 System.out.println(o);<\/tt><br \/>\n<tt> }<\/tt><tt> ArrayList&lt;String&gt; lista = new ArrayList&lt;String&gt;();<\/tt><br \/>\n<tt> ... preencher lista ...<\/tt><br \/>\n<tt> imprimirTodos(lista);\u00a0\u00a0 \/\/erro<\/tt><\/p>\n<p>UM <tt> ArrayList&lt;String&gt;<\/tt> objeto n\u00e3o pode ser passado como argumento para um m\u00e9todo que solicita um <tt> ArrayList&lt;Object&gt;<\/tt> porque os dois tipos s\u00e3o instancia\u00e7\u00f5es do mesmo tipo gen\u00e9rico, mas para <i> diferente<\/i> argumentos de tipo e, por esse motivo, n\u00e3o s\u00e3o compat\u00edveis entre si.<\/p>\n<p>Os tipos parametrizados concretos s\u00e3o instancia\u00e7\u00f5es concretas de um tipo gen\u00e9rico.\u00a0 S\u00e3o quase como tipos; existem apenas algumas restri\u00e7\u00f5es.\u00a0 N\u00c3O podem ser utilizados para os seguintes fins:<\/p>\n<ul>\n<li>para cria\u00e7\u00e3o de matrizes<\/li>\n<li>no tratamento de exce\u00e7\u00f5es<\/li>\n<li>numa classe literal<\/li>\n<li>num <tt> inst\u00e2ncia de<\/tt> express\u00e3o<\/li>\n<\/ul>\n<p>As matrizes que contenham elementos cujo tipo \u00e9 um tipo parametrizado concreto s\u00e3o ilegais.<\/p>\n<p>Exemplo (de tipo de array ilegal):<\/p>\n<p><tt> teste est\u00e1tico de vazio() {<\/tt><br \/>\n<tt> \u00a0 <b> <span style=\"color:#660000;\"> Par&lt;Inteiro,Inteiro&gt;[]<\/span> <\/b> intPairArr = novo <b> <span style=\"color:#660000;\"> Par&lt;Inteiro,Inteiro&gt;[10]<\/span> <\/b> ; <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 addElements(intPairArr);\u00a0<\/tt><br \/>\n<tt> \u00a0 Pair&lt;Integer,Integer&gt; par = intPairArr[1];<\/tt><br \/>\n<tt> \u00a0 Inteiro i = par.getFirst();<\/tt><br \/>\n<tt> \u00a0 par.setSecond(i);<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> static void addElements(<b> Objeto[]<\/b> objArr) {<\/tt><br \/>\n<tt> \u00a0 objArr[0] = new Par&lt;Integer,Integer&gt;(0,0);<\/tt><br \/>\n<tt> \u00a0 objArr[1] = new Par&lt;String,String&gt;(\"\",\"\");\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ deve falhar com ArrayStoreException<\/tt><br \/>\n<tt> }<\/tt><\/p>\n<p>O compilador pro\u00edbe a cria\u00e7\u00e3o de arrays cujo tipo de componente seja um tipo parametrizado concreto, como <tt> Par&lt;Inteiro,Inteiro&gt;<\/tt> no nosso exemplo.\u00a0 Discutimos na entrada anterior porque \u00e9 razo\u00e1vel que o compilador qualifique um<span style=\"color:#000000;\"> <tt> Par&lt;Inteiro,Inteiro&gt;[]<\/tt> <\/span> como ilegal.\u00a0 O principal problema \u00e9 que o compilador e o sistema de tempo de execu\u00e7\u00e3o devem garantir que um array \u00e9 um <i> homog\u00eaneo<\/i> sequ\u00eancia de elementos do mesmo tipo.\u00a0 Uma das verifica\u00e7\u00f5es de tipo, ou seja, a verifica\u00e7\u00e3o de armazenamento de arrays realizada pela m\u00e1quina virtual em tempo de execu\u00e7\u00e3o, n\u00e3o consegue detetar a inser\u00e7\u00e3o ofensiva de um elemento estranho. No exemplo, a segunda inser\u00e7\u00e3o no <tt> adicionarElementos<\/tt> O m\u00e9todo deveria falhar, porque estavam a adicionar um par de strings a um array de valores integrais, mas n\u00e3o falha como esperado. Os motivos foram discutidos na entrada anterior.<\/p>\n<p>Se n\u00e3o pudermos utilizar matrizes contendo elementos cujo tipo \u00e9 um tipo parametrizado concreto, o que utilizaremos como solu\u00e7\u00e3o alternativa?<\/p>\n<p>Consideremos tr\u00eas solu\u00e7\u00f5es alternativas conceb\u00edveis:<\/p>\n<ul>\n<li>matriz de tipos brutos<\/li>\n<li>matriz de tipo parametrizado wildcard ilimitado<\/li>\n<li>cole\u00e7\u00e3o em vez de array<\/li>\n<\/ul>\n<p>Embora as matrizes de tipos parametrizados concretos sejam ilegais, s\u00e3o permitidas cole\u00e7\u00f5es de tipos parametrizados concretos.<\/p>\n<p>Um tipo parametrizado curinga \u00e9 uma instancia\u00e7\u00e3o de um tipo gen\u00e9rico em que pelo menos um argumento de tipo \u00e9 um curinga.\u00a0 Exemplos de tipos parametrizados wildcard s\u00e3o <tt> Cole\u00e7\u00e3o&lt;?&gt;<\/tt> , <tt> Lista&lt;? estende o n\u00famero&gt;<\/tt> , <tt> Comparador&lt;? super String&gt;<\/tt> e <tt> Par&lt;String,?&gt;<\/tt> . Um tipo parametrizado wildcard denota uma fam\u00edlia de tipos que compreende instancia\u00e7\u00f5es concretas de um tipo gen\u00e9rico.\u00a0 O tipo de joker utilizado determina quais os tipos parametrizados concretos que pertencem \u00e0 fam\u00edlia.\u00a0 Por exemplo, o tipo parametrizado wildcard <tt> Cole\u00e7\u00e3o&lt;?&gt;<\/tt> denota a fam\u00edlia de todas as instancia\u00e7\u00f5es do <tt> Cole\u00e7\u00e3o<\/tt> interface independentemente do argumento de tipo.\u00a0 O tipo parametrizado curinga <tt> Lista&lt;? estende o n\u00famero&gt;<\/tt> denota a fam\u00edlia de todos os tipos de lista em que o tipo de elemento \u00e9 um subtipo de\u00a0 <tt> N\u00famero<\/tt> .\u00a0 O tipo parametrizado curinga <tt> Comparador&lt;? super String&gt;<\/tt> \u00e9 a fam\u00edlia de todas as instancia\u00e7\u00f5es do <tt> Comparador<\/tt> interface para tipos de argumentos de tipo que s\u00e3o supertipos de <tt> Corda.<\/tt><\/p>\n<p><strong><em>Um tipo parametrizado wildcard n\u00e3o \u00e9 um tipo no sentido regular (diferente de uma classe\/interface n\u00e3o parametrizada ou de um tipo bruto).<\/em> <\/strong><\/p>\n<p>Os tipos curinga parametrizados podem ser utilizados para digita\u00e7\u00e3o (como classes e interfaces n\u00e3o parametrizadas):<\/p>\n<ul>\n<li>como argumentos e tipos de m\u00e9todos de retorno<\/li>\n<li>como tipo de campo ou vari\u00e1vel de refer\u00eancia local<\/li>\n<li>como tipo de componente de um argumento de tipo arrayas de outros tipos parametrizados<\/li>\n<li>como tipo de alvo em lan\u00e7amentos<\/li>\n<\/ul>\n<p>N\u00e3o s\u00f3 os tipos podem ser gen\u00e9ricos, como os m\u00e9todos tamb\u00e9m podem ser gen\u00e9ricos. Os m\u00e9todos est\u00e1ticos e n\u00e3o est\u00e1ticos, bem como os construtores, podem ter par\u00e2metros de tipo. A sintaxe para a declara\u00e7\u00e3o dos par\u00e2metros formais do tipo \u00e9 semelhante \u00e0 sintaxe para os tipos gen\u00e9ricos. A sec\u00e7\u00e3o do par\u00e2metro de tipo \u00e9 delimitada por par\u00eantesis angulares e aparece antes do tipo de retorno do m\u00e9todo. A sua sintaxe e significado s\u00e3o id\u00eanticos \u00e0 lista de par\u00e2metros de tipo de um tipo gen\u00e9rico.<\/p>\n<p>Eis o exemplo de um gen\u00e9rico <tt> m\u00e1x.<\/tt> m\u00e9todo que calcula o maior valor numa cole\u00e7\u00e3o de elementos de tipo desconhecido <tt> UM<\/tt> .<\/p>\n<p>Exemplo (de um m\u00e9todo gen\u00e9rico):<\/p>\n<blockquote><p><tt> Cole\u00e7\u00f5es de turma {<\/tt><br \/>\n<tt> \u00a0 est\u00e1tica p\u00fablica <b> <span style=\"color:#000099;\"> &lt;A estende Compar\u00e1vel&lt;A&gt;&gt; A<\/span> <\/b> max(Cole\u00e7\u00e3o&lt;<b> <span style=\"color:#000099;\"> UM<\/span> <\/b> &gt; xs) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 Iterador&lt;<b> <span style=\"color:#000099;\"> UM<\/span> <\/b> &gt; xi = xs.iterator();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 <b> <span style=\"color:#000099;\"> UM<\/span> <\/b> w = xi. seguinte();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 while (xi.hasNext()) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#000099;\"> UM<\/span> <\/b> x = xi. seguinte();<\/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 retornar w;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }\u00a0<\/tt><\/p><\/blockquote>\n<p>O <tt> m\u00e1x.<\/tt> m\u00e9todo tem um par\u00e2metro de tipo, denominado<tt> UM<\/tt> .\u00a0 \u00c9 um espa\u00e7o reservado para o tipo de elemento da cole\u00e7\u00e3o em que o m\u00e9todo funciona. O par\u00e2metro type tem um limite; deve ser um tipo que seja um subtipo de <tt> Compar\u00e1vel&lt;A&gt;<\/tt><\/p>\n<p>Exemplo (do mesmo tipo gen\u00e9rico, desta vez <i> com<\/i> limites):<\/p>\n<blockquote><p><tt> interface p\u00fablica compar\u00e1vel&lt;T&gt; {<\/tt><br \/>\n<tt> \u00a0 public int compararTo(T arg);<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> classe p\u00fablica TreeMap&lt;Key <b> <span style=\"color:#000066;\"> estende Compar\u00e1vel&lt;Key&gt;<\/span> <\/b> ,Dados&gt;{<\/tt><br \/>\n<tt> \u00a0 private static class Entry&lt;K,V&gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Tecla K;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Valor V;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Entrada&lt;K,V&gt; esquerda = nulo;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Entrada&lt;K,V&gt; direita = nulo;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Entrada&lt;K,V&gt; pai;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 private transient Entry&lt;Key,Data&gt; root = null;<\/tt><br \/>\n<tt> \u00a0 ...<\/tt><br \/>\n<tt> \u00a0 private Entry&lt;Key,Data&gt; getEntry(chave-chave) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Entrada&lt;Key,Dados&gt; p = raiz;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Chave k = chave;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 while (p! = nulo) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int cmp = k.<b> <span style=\"color:#990000;\"> compareTo(p.key)<\/span> <\/b> ;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (cmp == 0)<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 devolver p;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sen\u00e3o se (cmp &lt; 0)<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 p = p. esquerda;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 outro\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 p = p.direito;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 retornar nulo;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 public boolean containsKey(Chave-chave) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 return getEntry(chave)! = nulo;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>No exemplo acima, o par\u00e2metro de tipo <tt> Chave<\/tt> tem o limite <tt> Compar\u00e1vel&lt;Key&gt;<\/tt> .\u00a0 A especifica\u00e7\u00e3o de um limite tem dois efeitos:<\/p>\n<ul>\n<li><i> D\u00e1 acesso aos m\u00e9todos que o limite especifica<\/i> .\u00a0 No exemplo, o limite <tt> Compar\u00e1vel&lt;Key&gt; <\/tt> d\u00e1 acesso ao <tt> comparar com<\/tt> m\u00e9todo que queremos invocar na implementa\u00e7\u00e3o do nosso <tt> \u00c1rvoreMapa<\/tt> aula.<\/li>\n<\/ul>\n<ul>\n<li><i> Apenas os tipos &#8220;dentro dos limites&#8221; podem ser utilizados para a instancia\u00e7\u00e3o do tipo gen\u00e9rico.<\/i> \u00a0 No exemplo, um tipo parametrizado como <tt> TreeMap&lt;Number,String&gt;<\/tt> seria rejeitado, porque o tipo <tt> N\u00famero<\/tt> n\u00e3o \u00e9 um subtipo de <tt> Compar\u00e1vel&lt;N\u00famero&gt;<\/tt> .\u00a0 Um tipo parametrizado como <tt> TreeMap&lt;String,String&gt;<\/tt> seria aceite, porque o tipo String est\u00e1 dentro dos limites, ou seja, \u00e9 um subtipo de <tt> Compar\u00e1vel&lt;String&gt;<\/tt> .<\/li>\n<\/ul>\n<p>Todas as classes, interfaces e tipos de enum podem ser utilizados como limite de par\u00e2metros de tipo, incluindo tipos aninhados e internos.\u00a0 Nem os tipos primitivos nem os tipos de array podem ser utilizados como limite de par\u00e2metros de tipo.<\/p>\n<p>Exemplos (de limites de par\u00e2metros de tipo):<\/p>\n<blockquote><p><tt> classe X0 &lt;T estende <b> <span style=\"color:#000099;\"> interno<\/span> <\/b> &gt; {...}\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> classe X1 &lt;T estende <b> <span style=\"color:#000099;\"> Objeto[]<\/span> <\/b> &gt; {...} <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> classe X2 &lt;T estende <b> <span style=\"color:#000099;\"> N\u00famero<\/span> <\/b> &gt; {...}<\/tt><br \/>\n<tt> classe X3 &lt;T estende <b> <span style=\"color:#000099;\"> Corda<\/span> <\/b> &gt; {...}<\/tt><br \/>\n<tt> classe X4 &lt;T estende <b> <span style=\"color:#000099;\"> Execut\u00e1vel<\/span> <\/b> &gt; {...}<\/tt><br \/>\n<tt> classe X5 &lt;T estende <b> <span style=\"color:#000099;\"> Thread.Estado<\/span> <\/b> &gt; {...}<\/tt><br \/>\n<tt> classe X6 &lt;T estende <b> <span style=\"color:#000099;\"> Lista<\/span> <\/b> &gt; {...}<\/tt><br \/>\n<tt> classe X7 &lt;T estende <b> <span style=\"color:#000099;\"> Lista&lt;String&gt;<\/span> <\/b> &gt; {...}<\/tt><br \/>\n<tt> classe X8 &lt;T estende <b> <span style=\"color:#000099;\"> Lista&lt;? estende o n\u00famero&gt;<\/span> <\/b> &gt; {...}<\/tt><br \/>\n<tt> classe X9 &lt;T estende <b> <span style=\"color:#000099;\"> Compar\u00e1vel&lt;? super N\u00famero&gt;<\/span> <\/b> &gt; {...}<\/tt><br \/>\n<tt> classe X10&lt;T estende <b> <span style=\"color:#000099;\"> Mapa.Entry&lt;?,?&gt;<\/span> <\/b> &gt; {...}<\/tt><\/p><\/blockquote>\n<p>O exemplo de c\u00f3digo mostra que tipos primitivos como <tt> interno<\/tt> e tipos de array como <tt> Objeto[] <\/tt> n\u00e3o s\u00e3o permitidos como limite de par\u00e2metro de tipo.<\/p>\n<p>Os tipos de classe, como <tt> N\u00famero<\/tt> ou <tt> Corda<\/tt> e tipos de interface, como <tt> Execut\u00e1vel<\/tt> , s\u00e3o permitidos como limite de par\u00e2metro de tipo.<\/p>\n<p>Os tipos de enumera\u00e7\u00e3o, como <tt> Thread.Estado<\/tt> tamb\u00e9m s\u00e3o permitidos como limite de par\u00e2metro de tipo. <tt> Thread.Estado<\/tt> \u00e9 um exemplo de um tipo aninhado utilizado como limite de par\u00e2metro de tipo.\u00a0 Os tipos internos n\u00e3o est\u00e1ticos tamb\u00e9m s\u00e3o permitidos.<\/p>\n<p>Os tipos brutos s\u00e3o permitidos como par\u00e2metros de tipo vinculados; <tt> <span style=\"color:#000000;\"> Lista<\/span> <\/tt> \u00e9 um exemplo.<\/p>\n<p>Os tipos parametrizados s\u00e3o permitidos como limite de par\u00e2metro de tipo, incluindo tipos parametrizados concretos, como <tt> Lista&lt;String&gt;<\/tt> , tipos parametrizados de joker limitados, como <tt> Lista&lt;? estende o n\u00famero&gt;<\/tt> e <tt> Compar\u00e1vel&lt;? superlongo&gt;<\/tt> e tipos parametrizados de wildcard ilimitados, como <tt> Mapa.Entry&lt;?,?&gt;<\/tt> .\u00a0 Um limite que \u00e9 um tipo parametrizado wildcard permite como argumento de tipo todos os tipos que pertencem \u00e0 fam\u00edlia de tipos que o joker denota.\u00a0 O limite de tipo parametrizado wildcard apenas fornece acesso restrito a campos e m\u00e9todos; as restri\u00e7\u00f5es dependem do tipo de joker.<\/p>\n<p>Exemplo (de tipo wildcard parametrizado como limite de par\u00e2metro de tipo):<\/p>\n<blockquote><p><tt> classe X&lt;<b> <span style=\"color:#000099;\"> T estende List&lt;? estende o n\u00famero&gt;<\/span> <\/b> &gt;{<\/tt><br \/>\n<tt> \u00a0 public void algumMetodo(T t) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 t.add(novo Longo(0L));\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 N\u00famero n = t.remove(0);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> classe Teste {<\/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;\"> Longo<\/span> <\/b> <span style=\"color:#000000;\"> &gt;&gt; x1 = new 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;\"> Corda<\/span> <\/b> <span style=\"color:#000000;\"> &gt;&gt; x2 = new X&lt;ArrayList&lt;String&gt;&gt;(); <\/span> <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Vari\u00e1veis \u200b\u200bde refer\u00eancia do tipo<tt> T <\/tt> (o par\u00e2metro de tipo) s\u00e3o tratados como vari\u00e1veis \u200b\u200bde refer\u00eancia de um tipo curinga (o par\u00e2metro de tipo ligado).\u00a0 No nosso exemplo, a consequ\u00eancia \u00e9 que o compilador rejeita a invoca\u00e7\u00e3o de m\u00e9todos que recebem um argumento do tipo &#8220;unknown&#8221; que o par\u00e2metro de tipo representa, como <tt> Lista.adicionar<\/tt> , porque o limite \u00e9 um tipo parametrizado wildcard com um limite superior.<br \/>\nAo mesmo tempo o limite <tt> Lista&lt;? estende o n\u00famero&gt;<\/tt> determina os tipos que podem ser utilizados como argumentos de tipo. O compilador aceita todos os argumentos de tipo que pertencem \u00e0 fam\u00edlia de tipos <tt> Lista&lt;? estende o n\u00famero&gt;<\/tt> , isto \u00e9, todos os subtipos de <tt> Lista<\/tt> com um argumento de tipo que \u00e9 um subtipo de <tt> N\u00famero<\/tt> .<\/p>\n<p>Um par\u00e2metro de tipo pode ser utilizado como limite de outro par\u00e2metro de tipo.<\/p>\n<p>Exemplo (de um par\u00e2metro de tipo utilizado como limite de par\u00e2metro de tipo):<\/p>\n<blockquote><p><tt> classe Triplo<b> &lt;T&gt;<\/b> {<\/tt><br \/>\n<tt> \u00a0 privado T fst, snd, trd;<\/tt><br \/>\n<tt> \u00a0 p\u00fablico &lt;<b> Voc\u00ea<\/b> <b> <span style=\"color:#000099;\"> estende T<\/span> <\/b> , <b> V <span style=\"color:#000099;\"> estende T<\/span> <\/b> , <b> C <span style=\"color:#000099;\"> estende T<\/span> <\/b> &gt; Triplo (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>Neste exemplo o par\u00e2metro de tipo <tt> T<\/tt> da classe parametrizada \u00e9 utilizado como limite dos par\u00e2metros do tipo <tt> Voc\u00ea<\/tt> ,\u00a0 <tt> V<\/tt> e <tt> C<\/tt> de um m\u00e9todo de inst\u00e2ncia parametrizado dessa classe.<\/p>\n<p>Outras oportunidades para utilizar par\u00e2metros de tipo como limites de outros par\u00e2metros de tipo incluem situa\u00e7\u00f5es em que um tipo aninhado \u00e9 definido dentro de um tipo gen\u00e9rico ou uma classe local \u00e9 definida dentro de um m\u00e9todo gen\u00e9rico.\u00a0 \u00c9 ainda permitido utilizar um par\u00e2metro de tipo como limite de outro par\u00e2metro de tipo na mesma sec\u00e7\u00e3o de par\u00e2metro de tipo.<\/p>\n<p>Um limite que \u00e9 uma classe d\u00e1 acesso a todos os seus membros p\u00fablicos, ou seja, campos p\u00fablicos, m\u00e9todos e tipos aninhados. Apenas os construtores n\u00e3o s\u00e3o acess\u00edveis, porque n\u00e3o h\u00e1 garantia de que uma subclasse do limite tenha os mesmos construtores que o limite.<\/p>\n<p>Exemplo (de uma classe utilizada como limite de um par\u00e2metro de tipo):<\/p>\n<blockquote><p><tt> aula p\u00fablica <span style=\"color:#000000;\"> SuperClasse<\/span> {<\/tt><tt> \u00a0\u00a0\u00a0 \/\/ membros est\u00e1ticos<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 enum public EnumType {ISSO, ISSO}<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 objeto est\u00e1tico p\u00fablico staticField;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public static void staticMethod() { ... }<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 \/\/ membros n\u00e3o est\u00e1ticos<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public class InnerClass {...}<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public object n\u00e3oStaticField;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public void n\u00e3oStaticMethod() { ... }<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 \/\/ construtores<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public SuperClass() { ... }<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 \/\/ membros privados<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 objeto privado campoprivado;\u00a0<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p>\n<p><tt> public final class SomeClass&lt;T extends <b> <span style=\"color:#006600;\"> SuperClasse<\/span> <\/b> &gt;{<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 objeto T privado;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public AlgumaClasse(T t) { objeto = t; }\u00a0<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0 public string paraString() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 retornar<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"tipo aninhado est\u00e1tico\u00a0\u00a0\u00a0 : \"+T.EnumType.class+\"\\n\"\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"campo est\u00e1tico\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \"+T.staticField+\"\\n\"<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"m\u00e9todo est\u00e1tico\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \"+T.staticMethod()+\"\\n\"<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"tipo aninhado n\u00e3o est\u00e1tico: \"+T.InnerClass.class+\"\\n\"<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"campo n\u00e3o est\u00e1tico\u00a0\u00a0\u00a0\u00a0\u00a0 : \"+object.nonStaticField+\"\\n\"<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"m\u00e9todo n\u00e3o est\u00e1tico\u00a0\u00a0\u00a0\u00a0 : \"+object.nonStaticMethod()+\"\\n\"<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"construtor\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \"+(novo T())+\"\\n\"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ erro<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +\"membro privado\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 : \"+object.privateField+\"\\n\"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ erro\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>O limite <tt> SuperClasse<\/tt> d\u00e1 acesso aos seus tipos aninhados, campos e m\u00e9todos est\u00e1ticos e campos e m\u00e9todos n\u00e3o est\u00e1ticos.\u00a0 Apenas o construtor n\u00e3o est\u00e1 acess\u00edvel.\u00a0 Isto ocorre porque os construtores n\u00e3o s\u00e3o herdados. Cada subclasse define os seus pr\u00f3prios construtores e n\u00e3o tem de suportar os construtores da sua superclasse.\u00a0 Assim, n\u00e3o h\u00e1 garantia de que uma subclasse de <tt> SuperClasse<\/tt> ter\u00e1 o mesmo construtor que a sua superclasse.<\/p>\n<p>O contexto em que<tt> Enum&lt;E estende Enum&lt;E&gt;&gt;<\/tt> &#8220;aparece \u00e9 a declara\u00e7\u00e3o do <tt> Enum<\/tt> classe no pacote <tt> java.lang<\/tt> :<\/p>\n<blockquote><p><tt> classe abstrata p\u00fablica <b> Enum&lt;E estende Enum&lt;E&gt;&gt;<\/b> {<\/tt><br \/>\n<tt> \u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>O tipo <tt> Enum<\/tt> \u00e9 a classe base comum de todos os tipos de enumera\u00e7\u00e3o.\u00a0 Em Java, um tipo de enumera\u00e7\u00e3o como <tt> Cor<\/tt> \u00e9 traduzido numa classe <tt> Cor<\/tt> que se estende <tt> Enum&lt;Color&gt;<\/tt> . O objectivo da superclasse <tt> Enum<\/tt> \u00e9 fornecer funcionalidade comum a todos os tipos de enumera\u00e7\u00e3o.<\/p>\n<p>Aqui est\u00e1 um esbo\u00e7o da aula <tt> Enum<\/tt> :<\/p>\n<blockquote><p><tt> classe abstrata p\u00fablica <b> Enum&lt;<span style=\"color:#000099;\"> E<\/span> estende Enum&lt;E&gt;&gt;<\/b> implementa Comparable&lt;<b> <span style=\"color:#000099;\"> E<\/span> <\/b> &gt;, serializ\u00e1vel {<\/tt><br \/>\n<tt> \u00a0 nome da string final privada;<\/tt><br \/>\n<tt> \u00a0 public final string nome() { ... }<\/tt><tt> \u00a0 privado final int ordinal;<\/tt><br \/>\n<tt> \u00a0 public final int ordinal() { ... }<\/tt><\/p>\n<p><tt> \u00a0 Enum protected (string nome, int ordinal) { ... }<\/tt><\/p>\n<p><tt> \u00a0 Public String\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 toString() { ... }<\/tt><br \/>\n<tt> \u00a0 public final boolean equals(Objecto outro) {...}<\/tt><br \/>\n<tt> \u00a0 public final int hashCode() { ... }<\/tt><br \/>\n<tt> \u00a0 protected end object clone() throws CloneNotSupportedException { ... }<\/tt><br \/>\n<tt> \u00a0 public final int compareTo(<b> <span style=\"color:#000099;\"> E<\/span> <\/b> o) {...}<\/tt><\/p>\n<p><tt> \u00a0 Classe final p\u00fablica&lt;<b> <span style=\"color:#000099;\"> E<\/span> <\/b> &gt; getDeclaringClass() { ... }<\/tt><br \/>\n<tt> \u00a0 public static &lt;T extends Enum&lt;T&gt;&gt; T valueOf(Class&lt;T&gt; enumType, String name) { ... }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>A caracter\u00edstica surpreendente da afirma\u00e7\u00e3o &#8220;<tt> Enum&lt;E estende Enum&lt;E&gt;&gt;<\/tt> &#8221; \u00e9 o facto de a classe rec\u00e9m-definida <tt> Enum<\/tt> e o seu par\u00e2metro de tipo rec\u00e9m-definido <tt> E <\/tt> aparecem no limite desse mesmo par\u00e2metro de tipo.\u00a0 Significa que o <tt> Enum<\/tt> type deve ser instanciado para um dos seus subtipos.\u00a0 Para perceber porque \u00e9 que isto faz sentido, considere-se que todo o tipo enum \u00e9 traduzido num subtipo de <tt> Enum<\/tt> .<\/p>\n<p>Eis o tipo de enum inventado <tt> Cor<\/tt> :<\/p>\n<blockquote><p><tt> enumera\u00e7\u00e3o <b> Cor<\/b> {VERMELHO, AZUL, VERDE}<\/tt><\/p><\/blockquote>\n<p>O compilador traduz-no na seguinte classe:<\/p>\n<blockquote><p><tt> aula final p\u00fablica <b> Cor<\/b> estende <b> Enum&lt;Color&gt;<\/b> {<\/tt><br \/>\n<tt> \u00a0 public static final Color[] valores() { return (Color[])$VALUES. clone(); }<\/tt><br \/>\n<tt> \u00a0 public static color valueOf (string nome) { ... }<\/tt><tt> \u00a0 private color (String s, int i) { super (s, i); }<\/tt><\/p>\n<p><tt> \u00a0 p\u00fablico est\u00e1tico final Cor VERMELHO;<\/tt><br \/>\n<tt> \u00a0 public static final Cor AZUL;<\/tt><br \/>\n<tt> \u00a0 p\u00fablico est\u00e1tico final Cor VERDE;<\/tt><\/p>\n<p><tt> \u00a0 private static final cor $VALUES[];<\/tt><\/p>\n<p><tt> \u00a0 est\u00e1tico {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 VERMELHO = new Cor(\"VERMELHO\", 0);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 AZUL = new Cor(\"AZUL\", 1);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 VERDE = nova Cor(\"VERDE\", 2);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 $VALUES = (nova Cor[] { VERMELHO, AZUL, VERDE });<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>A heran\u00e7a tem o efeito de que o <tt> Cor<\/tt> type herda todos os m\u00e9todos implementados no <tt> Enum&lt;Color&gt;<\/tt> .\u00a0 Entre eles est\u00e1 o <tt> comparar com<\/tt> m\u00e9todo.\u00a0 O <tt> Cor. comparar com<\/tt> m\u00e9todo deveria provavelmente levar um <tt> Cor<\/tt> como argumento.\u00a0 Para que isso aconte\u00e7a, a aula <tt> Enum<\/tt> \u00e9 gen\u00e9rico e o <tt> Enum.compareTo<\/tt> m\u00e9todo leva <tt> Enum<\/tt> par\u00e2metro de tipo <tt> E <\/tt> como argumento.\u00a0 Como resultado, digite <tt> Cor<\/tt> derivado de <tt> Enum&lt;Color&gt;<\/tt> herda um <tt> comparar com<\/tt> m\u00e9todo que leva um <tt> Cor<\/tt> como e argumento, exatamente como deveria.<br \/>\nSe dissecarmos a declara\u00e7\u00e3o &#8220;<tt> Enum&lt;E estende Enum&lt;E&gt;&gt;<\/tt> &#8220;podemos perceber que este padr\u00e3o tem v\u00e1rios aspetos.<\/p>\n<p>Em primeiro lugar, existe o facto de que o par\u00e2metro de tipo ligado \u00e9 o pr\u00f3prio tipo: &#8220;<tt> <b> Enum<\/b> &lt;E estende <b> Enum<\/b> &lt;E&gt;&gt;<\/tt> &#8220;. Garante que apenas os subtipos do tipo <tt> Enum<\/tt> s\u00e3o permitidos como argumentos de tipo. (Teoricamente, digite <tt> Enum<\/tt> poderia ser instanciado em si mesmo, como em <tt> Enum&lt;Enum&gt;<\/tt> , mas isso n\u00e3o \u00e9 certamente intencional e \u00e9 dif\u00edcil imaginar uma situa\u00e7\u00e3o em que tal instancia\u00e7\u00e3o seja \u00fatil.)<\/p>\n<p>Em segundo lugar, h\u00e1 o facto de que o tipo ligado ao par\u00e2metro \u00e9 o tipo parametrizado <tt> Enum<b> &lt;E&gt;<\/b> <\/tt> , que utiliza o par\u00e2metro de tipo <tt> E<\/tt> como o argumento de tipo do limite. Esta declara\u00e7\u00e3o garante que a rela\u00e7\u00e3o de heran\u00e7a entre um subtipo e uma instancia\u00e7\u00e3o de <tt> Enum<\/tt> \u00e9 da forma<tt> X estende Enum&lt;X&gt;<\/tt> &#8220;. Um subtipo como &#8220;<tt> X estende Enum&lt;Y&gt;<\/tt> &#8220;n\u00e3o pode ser declarado por causa do argumento de tipo <tt> S<\/tt> n\u00e3o estaria dentro dos limites; apenas subtipos de <tt> Enum&lt;X&gt;<\/tt> est\u00e3o dentro dos limites.<\/p>\n<p>Terceiro, h\u00e1 o facto de <tt> Enum<\/tt> \u00e9 gen\u00e9rico em primeiro lugar.\u00a0 Isto significa que alguns dos m\u00e9todos da classe <tt> Enum<\/tt> receber um argumento ou devolver um valor de um tipo desconhecido (ou depender de um tipo desconhecido). Como j\u00e1 sabemos, este tipo desconhecido ser\u00e1 mais tarde um subtipo <tt> X<\/tt> de <tt> Enum&lt;X&gt;<\/tt> .\u00a0 Portanto, no tipo parametrizado <tt> Enum&lt;X&gt;<\/tt> , estes m\u00e9todos envolvem o subtipo <tt> X<\/tt> , e s\u00e3o herdados no subtipo <tt> X<\/tt> .\u00a0 O <tt> comparar com<\/tt> m\u00e9todo \u00e9 um exemplo de um m\u00e9todo deste tipo; \u00e9 herdado da superclasse para cada subclasse e tem uma assinatura espec\u00edfica da subclasse em cada caso.<\/p>\n<p>Em suma, a declara\u00e7\u00e3o &#8220;<tt> Enum&lt;E estende Enum&lt;E&gt;&gt;<\/tt> &#8221; pode ser decifrado como: <tt> Enum<\/tt> \u00e9 um tipo gen\u00e9rico que s\u00f3 pode ser instanciado para os seus subtipos, e estes subtipos herdar\u00e3o alguns m\u00e9todos \u00fateis, alguns dos quais aceitam argumentos espec\u00edficos do subtipo (ou dependem do subtipo).<\/p>\n<p><b>Par\u00e2metros de tipo de limite inferior de classes<\/b><\/p>\n<p>Os par\u00e2metros de tipo podem ter v\u00e1rios limites, como por <tt> classe Box&lt;T extends Number&gt; {...}<\/tt> . Mas um par\u00e2metro de tipo n\u00e3o pode ter um limite inferior, ou seja, uma constru\u00e7\u00e3o como <tt> classe Caixa&lt;T <b> \u00f3timo<\/b> N\u00famero&gt; {...}<\/tt> n\u00e3o \u00e9 permitido.\u00a0 Por que n\u00e3o?\u00a0 A resposta \u00e9: \u00e9 in\u00fatil porque n\u00e3o lhe compraria nada, se lhe fosse permitido.\u00a0 Vamos ver porque \u00e9 que os par\u00e2metros de tipo de limite inferior das classes s\u00e3o confusos, explorando o que significa um limite superior num par\u00e2metro de tipo.<\/p>\n<p>O limite superior de um par\u00e2metro de tipo tem tr\u00eas efeitos:<\/p>\n<ol>\n<ol>\n<li><b> <i> Instancia\u00e7\u00e3o restrita.<\/i> <\/b> O limite superior restringe o conjunto de tipos que podem ser utilizados para a instancia\u00e7\u00e3o do tipo gen\u00e9rico.\u00a0 Se declararmos um <tt> classe Box&lt;T extends Number&gt; {...} <\/tt> ent\u00e3o o compilador garantiria que apenas subtipos de <tt> N\u00famero<\/tt> pode ser usado como argumento de tipo.\u00a0 Ou seja, um <tt> Caixa&lt;N\u00famero&gt;<\/tt> ou um <tt> Caixa&lt;Longa&gt;<\/tt> \u00e9 permitido, mas um <tt> Caixa&lt;Object&gt;<\/tt> ou <tt> Caixa&lt;String&gt;<\/tt> seria rejeitado<\/li>\n<\/ol>\n<\/ol>\n<p>Exemplo (de instancia\u00e7\u00e3o restrita devido a um limite superior num par\u00e2metro de tipo):<br \/>\n<tt> classe Box&lt;T extends N\u00famero&gt; {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 valor T privado;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 caixa p\u00fablica (T t) { valor = t; }\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }\u00a0<\/tt><tt> classe Teste {\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 = new Box&lt;Long&gt;(0L);\u00a0\u00a0 <b> \/\/ multar<\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Box&lt;String&gt; boxOfString = new Box&lt;String&gt;(\"\"); <b> <span style=\"color:#330000;\"> \/\/ erro: String n\u00e3o est\u00e1 dentro dos limites<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p>\n<ol>\n<li><b> <i> Acesso a membros n\u00e3o est\u00e1ticos. <\/i> <\/b> O limite superior d\u00e1 acesso a todos os m\u00e9todos e campos n\u00e3o est\u00e1ticos p\u00fablicos do limite superior.\u00a0 Na implementa\u00e7\u00e3o do nosso <tt> classe Box&lt;T extends Number&gt; {...}<\/tt> podemos invocar todos os m\u00e9todos p\u00fablicos n\u00e3o est\u00e1ticos definidos na classe <tt> N\u00famero<\/tt> , como <tt> intValor()<\/tt> por exemplo.\u00a0 Sem o limite superior, o compilador rejeitaria qualquer invoca\u00e7\u00e3o deste tipo. Exemplo (de acesso a membros n\u00e3o est\u00e1ticos devido a um limite superior num par\u00e2metro de tipo):<\/li>\n<\/ol>\n<p><tt> classe Box&lt;T extends N\u00famero&gt; {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 valor T privado;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 caixa p\u00fablica (T t) { valor = t; }\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public int incremento() { return valor.intValue()+1; } <b> \/\/ &lt;= seria um erro sem o limite de n\u00famero<\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }\u00a0<\/tt><\/p>\n<ol>\n<ol>\n<li><b> <i> Introduza Apagamento. <\/i> <\/b> O limite superior mais \u00e0 esquerda \u00e9 utilizado para a elimina\u00e7\u00e3o de tipos e substitui o par\u00e2metro de tipo no c\u00f3digo de bytes.\u00a0 Em nosso <tt> classe Box&lt;T extends Number&gt; {...}<\/tt> todas as ocorr\u00eancias de <tt> T<\/tt> seria substitu\u00eddo pelo limite superior <tt> N\u00famero<\/tt> .\u00a0 Por exemplo, se a classe <tt> Caixa<\/tt> tem um campo privado do tipo <tt> T<\/tt> e um m\u00e9todo <tt> conjunto vazio (conte\u00fado T) <\/tt> para definir este campo privado, ent\u00e3o o campo seria do tipo <tt> N\u00famero<\/tt> ap\u00f3s o apagamento do tipo e o m\u00e9todo seria traduzido para um m\u00e9todo <tt> conjunto vazio (conte\u00fado do n\u00famero)<\/tt> .<\/li>\n<\/ol>\n<\/ol>\n<p>Exemplo (de utiliza\u00e7\u00e3o do limite superior num par\u00e2metro de tipo no apagamento de tipos &#8211; <i> antes<\/i> tipo apagamento):<br \/>\n<tt> classe Caixa&lt;<b> T estende o n\u00famero<\/b> &gt;{\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 privado <b> T<\/b> valor;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 caixa p\u00fablica (<b> T<\/b> t) { valor = t; }\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }\u00a0<\/tt><\/p>\n<ol>\n<ol>Exemplo (de utiliza\u00e7\u00e3o do limite superior num par\u00e2metro de tipo no apagamento de tipos &#8211;<\/ol>\n<\/ol>\n<p><i> depois<\/i><\/p>\n<ol>\n<ol>tipo apagamento):<\/ol>\n<\/ol>\n<p>&nbsp;<\/p>\n<p><tt> classe Caixa {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 privado <b> N\u00famero<\/b> valor;\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 caixa p\u00fablica (<b> N\u00famero<\/b> t) { valor = t; }\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p>\n<ol>Al\u00e9m disso, o limite superior mais \u00e0 esquerda aparece noutros locais, como moldes inseridos automaticamente e m\u00e9todos de ponte.<\/ol>\n<p>Se fossem permitidos limites inferiores nos par\u00e2metros de tipo, que efeitos secund\u00e1rios teriam ou deveriam ter? Se uma constru\u00e7\u00e3o como <tt> classe Caixa&lt;T <b> \u00f3timo<\/b> N\u00famero&gt; {...} <\/tt> fossem permitidos, o que significaria?\u00a0 O que significariam os tr\u00eas efeitos colaterais de um limite de par\u00e2metro de tipo superior &#8211; instancia\u00e7\u00e3o restrita, acesso a membro n\u00e3o est\u00e1tico, apagamento de tipo &#8211; para um limite inferior?<\/p>\n<p><i> Instancia\u00e7\u00f5es restritas. <\/i> O compilador pode restringir o conjunto de tipos que podem ser utilizados para a instancia\u00e7\u00e3o do tipo gen\u00e9rico com um par\u00e2metro de tipo de limite inferior.\u00a0 Por exemplo, o compilador poderia permitir instancia\u00e7\u00f5es como <tt> Caixa&lt;N\u00famero&gt;<\/tt> e <tt> Caixa&lt;Object&gt;<\/tt> de um <tt> Caixa&lt;T <b> \u00f3timo<\/b> N\u00famero&gt; <\/tt> e rejeitar instancia\u00e7\u00f5es como <tt> Caixa&lt;Longa&gt;<\/tt> ou <tt> Caixa&lt;Curta&gt;<\/tt> .\u00a0 Este seria um efeito alinhado com o efeito colateral restritivo descrito para limites superiores de par\u00e2metros de tipo.<\/p>\n<p><i> Acesso a membros n\u00e3o est\u00e1ticos. <\/i> Um limite de par\u00e2metro de tipo inferior n\u00e3o d\u00e1 acesso a nenhum m\u00e9todo espec\u00edfico para al\u00e9m dos herdados da classe <tt> Objeto<\/tt> . No exemplo de <tt> Caixa&lt;T <b> \u00f3timo<\/b> N\u00famero&gt; <\/tt> os supertipos de <tt> N\u00famero<\/tt> n\u00e3o t\u00eam nada em comum, exceto que s\u00e3o tipos de refer\u00eancia e, portanto, subtipos de <tt> Objeto<\/tt> .\u00a0 O compilador n\u00e3o pode assumir que o campo do tipo <tt> T<\/tt> \u00e9 do tipo <tt> N\u00famero<\/tt> ou um subtipo do mesmo.\u00a0 Em vez disso, o campo do tipo <tt> T<\/tt> pode ser de qualquer supertipo de <tt> N\u00famero<\/tt> , como <tt> Serializ\u00e1vel<\/tt> ou <tt> Objeto<\/tt> .\u00a0 A invoca\u00e7\u00e3o de um m\u00e9todo como <tt> intValor()<\/tt> j\u00e1 n\u00e3o \u00e9 seguro para o tipo e o compilador teria de o rejeitar. Como consequ\u00eancia, o limite inferior do par\u00e2metro de tipo n\u00e3o daria acesso a membros n\u00e3o est\u00e1ticos para al\u00e9m dos definidos na classe <tt> Objeto<\/tt> e, portanto, tem o mesmo efeito que &#8220;sem limite&#8221;.<\/p>\n<p><i> Tipo de apagamento<\/i> .\u00a0 Seguindo esta linha de l\u00f3gica, n\u00e3o faz sentido substituir as ocorr\u00eancias do par\u00e2metro tipo pelo seu limite inferior mais \u00e0 esquerda.\u00a0 Declarando um m\u00e9todo como o construtor <tt> Caixa(<b> T<\/b> t) <\/tt> como construtor <tt> Caixa(<b> N\u00famero<\/b> t)<\/tt> n\u00e3o faz sentido, tendo em conta que <tt> T<\/tt> \u00e9 substitu\u00eddo por um supertipo de <tt> N\u00famero<\/tt> .\u00a0 Um <tt> Objeto<\/tt> pode ser corretamente passado para o construtor numa instancia\u00e7\u00e3o <tt> Caixa&lt;Object&gt;<\/tt> e o construtor rejeit\u00e1-lo-ia.\u00a0 Isso seria completamente errado.\u00a0\u00a0 Assim sendo, o apagamento de tipo substituiria todas as ocorr\u00eancias da vari\u00e1vel de tipo<tt> T<\/tt> por tipo <tt> Objeto<\/tt> , e n\u00e3o pelo seu limite inferior.\u00a0 Mais uma vez, o limite inferior teria o mesmo efeito que \u201csem limite\u201d.<\/p>\n<p>Quer descobrir o que significaria se ambos reduzissem <i> _e_<\/i> limites superiores foram permitidos?\u00a0\u00a0 Pessoalmente, nem quero pensar nisso e prefiro arquiv\u00e1-lo como \u201cn\u00e3o control\u00e1vel\u201d, se me permitir.<\/p>\n<p>O resultado final \u00e9: tudo isto \u00e9 &#8220;<tt> \u00f3timo<\/tt> &#8220;O limite comprar-lhe-ia \u00e9 a restri\u00e7\u00e3o de que apenas os supertipos de <tt> N\u00famero<\/tt> podem ser utilizados como argumentos de tipo.\u00a0 E mesmo isso \u00e9 muitas vezes mal compreendido.\u00a0 N\u00c3O significaria que <tt> classe Box&lt;T super N\u00famero&gt; {...}<\/tt> cont\u00e9m apenas inst\u00e2ncias de supertipos de <tt> N\u00famero<\/tt> .\u00a0 Muito pelo contr\u00e1rio &#8211; como demonstra o exemplo abaixo!<\/p>\n<p>Exemplo (de utiliza\u00e7\u00e3o do limite superior num par\u00e2metro de tipo no apagamento de tipos &#8211; <i> antes<\/i> tipo apagamento):<\/p>\n<div style=\"margin-left:40px;\">\n<blockquote><p><tt> classe Caixa&lt;<b> Supern\u00famero T<\/b> &gt;{<\/tt><br \/>\n<tt> \u00a0\u00a0 privado <b> T<\/b> valor;<\/tt><br \/>\n<tt> \u00a0\u00a0 caixa p\u00fablica (<b> T<\/b> t) { valor = t; }<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<\/div>\n<p>Exemplo (de utiliza\u00e7\u00e3o do limite superior num par\u00e2metro de tipo no apagamento de tipos &#8211; <i> depois<\/i> tipo apagamento):<\/p>\n<div style=\"margin-left:40px;\">\n<blockquote><p><tt> classe Caixa {<\/tt><br \/>\n<tt> \u00a0\u00a0 privado <b> Objeto<\/b> valor;<\/tt><br \/>\n<tt> \u00a0\u00a0 caixa p\u00fablica (<b> Objeto<\/b> t) { valor = t; }<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<\/div>\n<p>UM <tt> classe Caixa&lt;T <b> \u00f3timo<\/b> N\u00famero&gt; {...} <\/tt> seria traduzido por tipo apagamento para um <tt> Caixa<\/tt> contendo um <tt> Objeto<\/tt> campo e o seu construtor seriam traduzidos para <tt> Caixa (Objecto t)<\/tt> . Isto \u00e9 fundamentalmente diferente de um <tt> classe Caixa&lt;T <b> estende<\/b> N\u00famero&gt; {...}<\/tt> , que seria traduzido para um <tt> Caixa<\/tt> contendo um <tt> N\u00famero<\/tt> campo e o seu construtor seriam traduzidos para <tt> Caixa (N\u00famero t)<\/tt> . Consequentemente, um <tt> Caixa&lt;N\u00famero&gt;<\/tt> instanciado de um<tt> classe Box&lt;T extends Number&gt; {...}<\/tt> seria diferente de um <tt> Caixa&lt;N\u00famero&gt;<\/tt> instancia\u00e7\u00e3o de um <tt> classe Box&lt;T super N\u00famero&gt; {...}<\/tt> , o que provavelmente causar\u00e1 confus\u00e3o.\u00a0 Por esta raz\u00e3o, os limites inferiores n\u00e3o fazem sentido nos par\u00e2metros de tipo das classes.<\/p>\n<p>&nbsp;<\/p>\n<hr width=\"100%\" \/>\n<p>&nbsp;<\/p>\n<p><b>Par\u00e2metros de tipo de limite inferior de m\u00e9todos<\/b><\/p>\n<p>Em conjunto com os m\u00e9todos e os seus tipos de argumentos, um par\u00e2metro de tipo com um limite inferior pode ser ocasionalmente \u00fatil.<\/p>\n<p>Exemplo (de um m\u00e9todo que beneficiaria de um par\u00e2metro de tipo com limite inferior):<\/p>\n<blockquote><p><tt> classe Par&lt;X,Y&gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0 privado X primeiro;<\/tt><br \/>\n<tt> \u00a0\u00a0 privado Y segundo;<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> \u00a0\u00a0 p\u00fablico &lt;<b> Um super X<\/b> ,<b> B super Y<\/b> &gt; B addToMap(Map&lt;A,B&gt; map) { \/\/ erro: o par\u00e2metro de tipo n\u00e3o pode ter limite inferior<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 return mapa.put(primeiro, segundo);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> classe Teste {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public static void main(String[] args) {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Par&lt;String,Long&gt; par = new Par&lt;&gt;(\"ABC\",42L);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Map&lt;CharSequence, Number&gt; map = HashMap&lt;CharSequence, Number&gt;();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 N\u00famero n\u00famero = par.addToMap(mapa);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>O <tt> addToMap()<\/tt> m\u00e9todo adiciona o conte\u00fado do par a um mapa.\u00a0 Qualquer mapa que possa conter supertipos de <tt> X<\/tt> e <tt> S<\/tt> faria.\u00a0 O mapa <tt> colocar()<\/tt> O m\u00e9todo devolve o valor encontrado no mapa para a chave fornecida, se j\u00e1 existir uma entrada de valor-chave para a chave no mapa.\u00a0 O valor de retorno do mapa <tt> colocar()<\/tt> m\u00e9todo deve ser devolvido do <tt> addToMap()<\/tt> m\u00e9todo.\u00a0 Nestas circunst\u00e2ncias, gostar\u00edamos de declarar o m\u00e9todo como mostrado acima: O mapa \u00e9 parametrizado com supertipos dos par\u00e2metros de tipo do par e o <tt> addToMap()<\/tt> O tipo de retorno do m\u00e9todo \u00e9 o tipo de valor do mapa.<\/p>\n<p>Como o compilador n\u00e3o permite limites inferiores nos par\u00e2metros de tipo, precisamos de uma solu\u00e7\u00e3o alternativa.<\/p>\n<p>Uma solu\u00e7\u00e3o alternativa que vem \u00e0 mente \u00e9 o uso de um curinga, porque os curingas podem ter um limite inferior.\u00a0 Aqui est\u00e1 uma solu\u00e7\u00e3o alternativa usando um caractere curinga.<\/p>\n<p>Exemplo (de uma solu\u00e7\u00e3o alternativa para o exemplo anterior utilizando wildcards):<\/p>\n<blockquote><p><tt> classe Par&lt;X,Y&gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0 privado X primeiro;<\/tt><br \/>\n<tt> \u00a0\u00a0 privado Y segundo;<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> \u00a0\u00a0 p\u00fablico <b> Objeto<\/b> addToMap(Map&lt;<b> ? Super X<\/b> , <b> ? super Y<\/b> Mapa &gt;) {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 return mapa.put(primeiro, segundo);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> classe Teste {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public static void main(String[] args) {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Par&lt;String,Long&gt; par = new Par&lt;&gt;(\"ABC\",42L);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Map&lt;CharSequence, Number&gt; map = HashMap&lt;CharSequence, Number&gt;();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 N\u00famero n\u00famero = <b> (N\u00famero)<\/b> par.addToMap(mapa);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Funciona, exceto que n\u00e3o h\u00e1 forma de declarar o tipo de retorno como desejado.\u00a0 Seria o supertipo de <tt> S<\/tt> que o compilador captura do tipo de mapa, mas n\u00e3o existe sintaxe para o especificar.\u00a0 N\u00e3o devemos declarar o tipo de retorno como &#8220;<tt> ? super Y<\/tt> &#8220;, porque &#8220;<tt> ? super Y<\/tt> &#8220;\u00e9 um joker e n\u00e3o um tipo e, portanto, n\u00e3o \u00e9 permitido como tipo de retorno. N\u00e3o temos escolha e devemos usar <tt> Objeto<\/tt> vez, como o tipo de retorno do nosso m\u00e9todo.\u00a0 Este tipo de retorno bastante inespec\u00edfico, por sua vez, obriga os chamadores do <tt> addToMap()<\/tt> m\u00e9todo para converter o valor de retorno para baixo de <tt> Objeto<\/tt> ao seu tipo real.\u00a0 N\u00e3o era bem isso que t\u00ednhamos em mente.<\/p>\n<p>Outra solu\u00e7\u00e3o alternativa \u00e9 a utiliza\u00e7\u00e3o de m\u00e9todos est\u00e1ticos.\u00a0 Aqui est\u00e1 uma solu\u00e7\u00e3o alternativa com um m\u00e9todo est\u00e1tico em vez de um m\u00e9todo n\u00e3o est\u00e1tico.<\/p>\n<p>Exemplo (de uma solu\u00e7\u00e3o alternativa para o exemplo anterior utilizando um m\u00e9todo est\u00e1tico):<\/p>\n<blockquote><p><tt> classe Par&lt;X,Y&gt; {<\/tt><br \/>\n<tt> \u00a0\u00a0 privado X primeiro;<\/tt><br \/>\n<tt> \u00a0\u00a0 privado Y segundo;<\/tt><br \/>\n<tt> \u00a0\u00a0 ...<\/tt><br \/>\n<tt> \u00a0\u00a0 p\u00fablico <b> est\u00e1tico<\/b> &lt;<b> UM<\/b> ,<b> B<\/b> , X <b> estende A<\/b> ,S <b> estende B<\/b> &gt; B addToMap(Par&lt;X,par Y&gt;, Mapa&lt;<b> UM<\/b> ,<b> B<\/b> Mapa &gt;) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 return mapa.put(par.primeiro,par.segundo);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><br \/>\n<tt> classe Teste {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0 public static void main(String[] args) {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Par&lt;String,Long&gt; par = new Par&lt;&gt;(\"ABC\",42L);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 Map&lt;CharSequence, Number&gt; map = HashMap&lt;CharSequence, Number&gt;();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0 N\u00famero n\u00famero = <b> Par<\/b> . addToMap(<b> par<\/b> ,mapa);<\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>O gen\u00e9rico <tt> addToMap()<\/tt> m\u00e9todo tem quatro par\u00e2metros de tipo: dois espa\u00e7os reservados <tt> X<\/tt> e <tt> S<\/tt> para o tipo do par e dois espa\u00e7os reservados <tt> UM<\/tt> e <tt> B <\/tt> para o tipo do mapa. <tt> UM<\/tt> e <tt> B<\/tt> s\u00e3o supertipos de <tt> X<\/tt> e <tt> S<\/tt> , porque <tt> X<\/tt> e <tt> S<\/tt> \u00a0 s\u00e3o declarados com <tt> UM<\/tt> e <tt> B<\/tt> como os seus limites superiores. (Note que os par\u00e2metros de tipo do m\u00e9todo gen\u00e9rico <tt> X<\/tt> e <tt> S<\/tt> n\u00e3o tem nada a ver com <tt> Par<\/tt> aula <tt> X<\/tt> e <tt> S<\/tt> par\u00e2metros.\u00a0 Os nomes <tt> X<\/tt> e <tt> S<\/tt> s\u00e3o reutilizados para o m\u00e9todo gen\u00e9rico para os tornar facilmente reconhec\u00edveis como par\u00e2metros de tipo do par. Utilizando quatro par\u00e2metros de tipo, podemos declarar o tipo de retorno preciso conforme desejado: \u00e9 o mesmo tipo que o tipo de valor do mapa.<\/p>\n<p>Exemplo (de utiliza\u00e7\u00e3o ilegal de par\u00e2metro de tipo em contexto est\u00e1tico de uma classe gen\u00e9rica):<\/p>\n<blockquote><p><tt> classe SomeClass<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> inicializador est\u00e1tico, campo est\u00e1tico, m\u00e9todo est\u00e1tico<\/i><br \/>\n<tt> \u00a0 <b> est\u00e1tico<\/b> {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 AlgumClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> Teste &gt; = new SomeClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> &gt;(); <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 privado <b> est\u00e1tico<\/b> <b> <span style=\"color:#000099;\"> T<\/span> <\/b> informa\u00e7\u00f5es globais;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 p\u00fablico\u00a0 <b> est\u00e1tico<\/b> <b> <span style=\"color:#000099;\"> T <\/span> <\/b> getGlobalInfo() {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 devolver informa\u00e7\u00f5es globais;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> inicializador n\u00e3o est\u00e1tico, campo n\u00e3o est\u00e1tico, m\u00e9todo n\u00e3o est\u00e1tico<\/i><br \/>\n<tt> \u00a0 {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 AlgumClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> Teste &gt; = new SomeClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> &gt;();<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 privado\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#000099;\"> T<\/span> <\/b> informa\u00e7\u00f5es locais;<\/tt><br \/>\n<tt> \u00a0 p\u00fablico\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 devolver informa\u00e7\u00f5es locais;<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> tipos aninhados est\u00e1ticos<\/i><br \/>\n<tt> \u00a0 p\u00fablico <b> est\u00e1tico<\/b> <b> aula<\/b> A falha estende a exce\u00e7\u00e3o {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 final privada <b> <span style=\"color:#000099;\"> T<\/span> <\/b> informa\u00e7\u00f5es;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 falha p\u00fablica (<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) { informa\u00e7\u00e3o = t; }\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 p\u00fablico <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getInfo() { devolver informa\u00e7\u00e3o; }\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 privado <b> interface<\/b> Copi\u00e1vel {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 <b> <span style=\"color:#000099;\"> T<\/span> <\/b> c\u00f3pia();\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;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 privado <b> enumera\u00e7\u00e3o<\/b> Estado {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 V\u00c1LIDO, INV\u00c1LIDO;<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 privado <b> <span style=\"color:#000099;\"> T<\/span> <\/b> informa\u00e7\u00f5es; \/\/erro<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 public void setInfo(<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) { informa\u00e7\u00e3o = t; } <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 p\u00fablico <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getInfo() { devolver informa\u00e7\u00e3o; }\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> tipos aninhados n\u00e3o est\u00e1ticos<\/i><br \/>\n<tt> \u00a0 p\u00fablico <b> aula<\/b> Acessador {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 p\u00fablico <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getInfo() { return localInfo; }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>O exemplo ilustra que o par\u00e2metro type n\u00e3o pode ser utilizado no contexto est\u00e1tico de uma classe gen\u00e9rica.\u00a0 Mostra tamb\u00e9m que as interfaces aninhadas e os tipos enum s\u00e3o considerados membros do tipo est\u00e1tico da classe.\u00a0 Apenas as classes internas, ou seja, as classes aninhadas n\u00e3o est\u00e1ticas, podem utilizar o par\u00e2metro de tipo da classe gen\u00e9rica envolvente.<\/p>\n<p>O \u00e2mbito do par\u00e2metro de tipo de uma interface \u00e9 toda a defini\u00e7\u00e3o da interface, exceto quaisquer campos ou tipos aninhados.\u00a0 Isto ocorre porque os campos e tipos aninhados definidos numa interface s\u00e3o implicitamente est\u00e1ticos.<\/p>\n<p>Exemplo (de utiliza\u00e7\u00e3o ilegal de par\u00e2metro de tipo numa interface gen\u00e9rica):<\/p>\n<blockquote><p><tt> interface SomeInterface<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> campo<\/i><br \/>\n<tt> \u00a0 AlgumClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> Valor &gt; = new SomeClass&lt;<b> <span style=\"color:#000099;\"> T<\/span> <\/b> &gt;();\u00a0 <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> tipo aninhado<\/i><br \/>\n<tt> \u00a0 <b> aula<\/b> Acessador {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 p\u00fablico <b> <span style=\"color:#000099;\"> T <\/span> <\/b> getInfo() {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <b> <span style=\"color:#660000;\"> \/\/erro<\/span> <\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 return valor.getGlobalInfo();<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 \/\/ <\/tt> <i> m\u00e9todos<\/i><br \/>\n<tt> \u00a0 <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getValor();<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>O exemplo mostra que os campos de uma interface s\u00e3o implicitamente est\u00e1ticos, pelo que o par\u00e2metro de tipo n\u00e3o pode ser utilizado em lado nenhum na declara\u00e7\u00e3o de um campo de uma interface gen\u00e9rica.\u00a0 Da mesma forma, a classe aninhada \u00e9 considerada uma classe aninhada est\u00e1tica, e n\u00e3o uma classe interna, e por esta raz\u00e3o a utiliza\u00e7\u00e3o do par\u00e2metro type em qualquer parte da classe aninhada \u00e9 ilegal.<\/p>\n<p><b> <i> Solu\u00e7\u00e3o alternativa para classes e interfaces est\u00e1ticas aninhadas:<\/i> <\/b><\/p>\n<p>No caso de classes e interfaces aninhadas est\u00e1ticas, isto n\u00e3o \u00e9 uma grande calamidade.\u00a0 Como solu\u00e7\u00e3o alternativa, podemos gerar a classe est\u00e1tica ou a pr\u00f3pria interface.<\/p>\n<p>Exemplo (solu\u00e7\u00e3o alternativa \u2013 gerar o tipo est\u00e1tico aninhado):<\/p>\n<blockquote><p><tt> classe Wrapper<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 final privada <b> <span style=\"color:#000099;\"> T<\/span> <\/b> oObjeto;<\/tt><\/p><\/blockquote>\n<blockquote><p><tt> \u00a0 inv\u00f3lucro p\u00fablico (<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) { oObjecto = t; }<\/tt><br \/>\n<tt> \u00a0 p\u00fablico <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getWrapper() { return oObjecto; }<\/tt><tt> \u00a0 p\u00fablico imut\u00e1vel<b> &lt;T&gt;<\/b> makeImut\u00e1vel() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 retornar novo Imut\u00e1vel<b> &lt;T&gt;<\/b> (oObjecto);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 mut\u00e1vel p\u00fablico<b> &lt;T&gt;<\/b> makeMutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 retornar novo Mut\u00e1vel<b> &lt;T&gt;<\/b> (oObjecto);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 private static &lt;A&gt; A makeClone(A theObject) { ... }<\/tt><\/p>\n<p><tt> \u00a0 classe final est\u00e1tica p\u00fablica imut\u00e1vel<b> &lt;A&gt;<\/b> { <b> \/\/ \u00e9 uma classe gen\u00e9rica agora<\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 final privada <b> UM<\/b> oObjeto;<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 p\u00fablico Imut\u00e1vel (<b> UM<\/b> arg) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 theObject = makeClone(arg);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 p\u00fablico <b> UM<\/b> getWrappedItem() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return makeClone(oObjecto);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 classe est\u00e1tica p\u00fablica mut\u00e1vel<b> &lt;A&gt;<\/b> {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ... semelhante ...<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>N\u00e3o existe tal solu\u00e7\u00e3o alternativa para tipos de enum aninhados porque n\u00e3o podem ser gen\u00e9ricos.<\/p>\n<p><b> <i> Solu\u00e7\u00e3o alternativa para classes est\u00e1ticas aninhadas:<\/i> <\/b><\/p>\n<p>Se o tipo est\u00e1tico aninhado for uma classe, uma solu\u00e7\u00e3o alternativa seria transformar a classe est\u00e1tica numa classe interna n\u00e3o est\u00e1tica.<\/p>\n<p>Exemplo (solu\u00e7\u00e3o alternativa \u2013 utilizar uma classe interna):<\/p>\n<blockquote><p><tt> classe Wrapper<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 final privada <b> <span style=\"color:#000099;\"> T<\/span> <\/b> oObjeto;<\/tt><\/p><\/blockquote>\n<blockquote><p><tt> \u00a0 inv\u00f3lucro p\u00fablico (<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) { oObjecto = t; }<\/tt><br \/>\n<tt> \u00a0 p\u00fablico <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getWrapper() { return oObjecto; }<\/tt><tt> \u00a0 public Mut\u00e1vel makeMutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 retornar <b> esse.<\/b> novo Mut\u00e1vel(oObjecto);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 public Imut\u00e1vel makeImmutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 retornar <b> esse.<\/b> novo Imut\u00e1vel(oObjecto);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 private static &lt;A&gt; A makeClone(A theObject) { ... }<\/tt><\/p>\n<p><tt> \u00a0 classe final p\u00fablica Imut\u00e1vel {\u00a0 <b> \/\/ j\u00e1 n\u00e3o \u00e9 uma classe est\u00e1tica<\/b> <\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 final privada <b> T<\/b> oObjeto;<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0\u00a0\u00a0 p\u00fablico Imut\u00e1vel (<b> T<\/b> arg) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 theObject = makeClone(arg);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 p\u00fablico <b> T<\/b> getWrappedItem() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return makeClone(oObjecto);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 classe p\u00fablica mut\u00e1vel\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ... semelhante ...<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Esta solu\u00e7\u00e3o alternativa traz uma certa sobrecarga porque todas as classes internas t\u00eam uma refer\u00eancia oculta a uma inst\u00e2ncia do tipo externo, da qual, neste exemplo, n\u00e3o precisam nem tiram partido; a refer\u00eancia oculta \u00e9 apenas bagagem.\u00a0 Muitas vezes, as classes internas s\u00e3o combinadas com interfaces para manter a classe interna como um detalhe de implementa\u00e7\u00e3o privado da classe envolvente.\u00a0 Podemos fazer o mesmo aqui.<\/p>\n<p>Exemplo (a solu\u00e7\u00e3o alternativa anterior refinada):<\/p>\n<blockquote><p><tt> classe Wrapper<b> <span style=\"color:#000099;\"> &lt;T&gt;<\/span> <\/b> {<\/tt><br \/>\n<tt> \u00a0 final privada <b> <span style=\"color:#000099;\"> T<\/span> <\/b> oObjeto;<\/tt><\/p><\/blockquote>\n<blockquote><p><tt> \u00a0 inv\u00f3lucro p\u00fablico (<b> <span style=\"color:#000099;\"> T<\/span> <\/b> t) { oObjecto = t; }<\/tt><br \/>\n<tt> \u00a0 p\u00fablico <b> <span style=\"color:#000099;\"> T<\/span> <\/b> getWrapper() { return oObjecto; }<\/tt><tt> \u00a0 mut\u00e1vel p\u00fablico<b> &lt;T&gt;<\/b> makeMutable() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 return this.new Mutable(theObject);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 p\u00fablico imut\u00e1vel<b> &lt;T&gt;<\/b> makeImut\u00e1vel() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 return this.new Imut\u00e1vel(oObjecto);<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 private static &lt;A&gt; A makeClone(A theObject) { ... }<\/tt><\/p>\n<p><tt> \u00a0 <b> interface p\u00fablica <\/b> Imut\u00e1vel&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> interface p\u00fablica <\/b> Mut\u00e1vel&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> privado<\/b> classe final ImmutableImplementation <b> implementa Imut\u00e1vel&lt;T&gt;<\/b> {\u00a0<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0\u00a0\u00a0 private final T theObject;<\/tt><\/p>\n<p><tt> \u00a0\u00a0\u00a0\u00a0\u00a0 public ImmutableImplementation(T arg) {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 theObject = makeClone(arg);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 public T getWrappedItem() {<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return makeClone(oObjecto);<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0 }<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> \u00a0 <b> privado<\/b> classe MutableImplementation <b> implementa Mutable&lt;T&gt;<\/b> {\u00a0<\/tt><br \/>\n<tt> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ... semelhante ...<\/tt><br \/>\n<tt> \u00a0 }<\/tt><br \/>\n<tt> }<\/tt><\/p><\/blockquote>\n<p>Como pode ver, as interfaces p\u00fablicas aninhadas precisam de ser gen\u00e9ricas, enquanto as classes privadas internas podem utilizar o par\u00e2metro de tipo da classe envolvente.<\/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>Consulte estas constru\u00e7\u00f5es comuns para mais informa\u00e7\u00f5es: <a href=\"http:\/\/www.angelikalanger.com\/GenericsFAQ\/JavaGenericsFAQ.html#SECTION1\" rel=\"nofollow\">http:\/\/www.angelikalanger.com\/GenericsFAQ\/JavaGenericsFAQ.html#SECTION1<\/a> Aqui resumimos alguns pontos importantes deste FAQ. Exemplo (de tipo gen\u00e9rico): classe Par&lt;X,Y&gt; {\u00a0 \u00a0 privado X primeiro; \u00a0 privado e segundo; \u00a0 public par (X a1, Y a2) { \u00a0\u00a0\u00a0 primeiro = a1; \u00a0\u00a0\u00a0 segundo = a2; \u00a0 } \u00a0 public X getFirst() { return [&hellip;]<\/p>\n","protected":false},"author":65283547,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"Generics in short form","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1017],"tags":[18369,2549795,6280762],"class_list":["post-31","post","type-post","status-publish","format-standard","hentry","category-java","tag-genericos","tag-java","tag-genericos-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":"O segundo conc\u00edlio ecum\u00e9nico em Constantinopla (381) - a confirma\u00e7\u00e3o da doutrina do Esp\u00edrito Santo","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;Artigos dedicados \u00e0 B\u00edblia e sobre o esp\u00edrito e o corpo&quot;","block_context":{"text":"Artigos dedicados \u00e0 B\u00edblia e sobre o esp\u00edrito e o corpo","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":"O Quinto Conc\u00edlio Ecum\u00e9nico de Constantinopla (553): A Controv\u00e9rsia das Tr\u00eas Cabe\u00e7as, o Legado Teol\u00f3gico de Calced\u00f3nia e a Pol\u00edtica do Imperador Justiniano 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;Artigos dedicados \u00e0 B\u00edblia e sobre o esp\u00edrito e o corpo&quot;","block_context":{"text":"Artigos dedicados \u00e0 B\u00edblia e sobre o esp\u00edrito e o corpo","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":"A minha vis\u00e3o de Deus, da B\u00edblia e de Cristo","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;Artigos dedicados \u00e0 B\u00edblia e sobre o esp\u00edrito e o corpo&quot;","block_context":{"text":"Artigos dedicados \u00e0 B\u00edblia e sobre o esp\u00edrito e o corpo","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":"Por Deus e pelo Universo","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;Artigos dedicados \u00e0 B\u00edblia e sobre o esp\u00edrito e o corpo&quot;","block_context":{"text":"Artigos dedicados \u00e0 B\u00edblia e sobre o esp\u00edrito e o corpo","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":"O III Conc\u00edlio Ecum\u00e9nico de \u00c9feso (431): a disputa cristol\u00f3gica entre Cirilo de Alexandria e Nest\u00f3rio e a afirma\u00e7\u00e3o da doutrina da M\u00e3e de Deus","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;Artigos dedicados \u00e0 B\u00edblia e sobre o esp\u00edrito e o corpo&quot;","block_context":{"text":"Artigos dedicados \u00e0 B\u00edblia e sobre o esp\u00edrito e o corpo","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":"O Sexto Conc\u00edlio Ecum\u00e9nico de Constantinopla (680-681): a condena\u00e7\u00e3o do monotelismo e a afirma\u00e7\u00e3o das duas vontades e das duas a\u00e7\u00f5es em Jesus Cristo","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;Artigos dedicados \u00e0 B\u00edblia e sobre o esp\u00edrito e o corpo&quot;","block_context":{"text":"Artigos dedicados \u00e0 B\u00edblia e sobre o esp\u00edrito e o corpo","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}]}}