

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: A parte bizarra de Generics</title>
	<atom:link href="http://www.kumpera.net/blog/index.php/2006/08/08/a-parte-bizarra-de-generics/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kumpera.net/blog/index.php/2006/08/08/a-parte-bizarra-de-generics/</link>
	<description>Meus achados sobre tecnologia</description>
	<lastBuildDate>Thu, 02 Sep 2010 20:00:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: kumpera</title>
		<link>http://www.kumpera.net/blog/index.php/2006/08/08/a-parte-bizarra-de-generics/comment-page-1/#comment-396</link>
		<dc:creator>kumpera</dc:creator>
		<pubDate>Fri, 25 Aug 2006 13:42:09 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/08/08/a-parte-bizarra-de-generics/#comment-396</guid>
		<description>Tudo bem Bruno.

Os parâmetros de um tipo genérico não implicam em uma hierarquia, ou seja, List&lt;String&gt; não extende List&lt;Object&gt;. Logo não dá para fazer esse cast de forma válida.

Fora isso, não dá para o compilador adivinhar se em um dado trecho de código, o correto são tipos lower-bound ou upper-bound. Tanto que precisamos informar isso explicitamente.

O compilador não tem como adivinhar, pois o contrato correto depende de como usarmos esses objetos. No teu exemplo, é feito um cast de List&lt;Object&gt; para List&lt;String&gt;, isso não dá para o compilador adivinhar sozinho, já que são tipos distintos, um não herda do outro.

No final das contas, wildcards são usadas principalmente para definir os parâmetros ou retorno de um método, e um método de uma classe genérica.

Existem algorítmos que permitiriam ao compilador adivinhar qual o wildcard correto, a linguagem ML faz isso ao máximo, só que isso acaba por confundir demais os desenvolvedores, que em alguns momentos ficam simplesmente perdidos tentando entender que maluquice o compilador assumiu.</description>
		<content:encoded><![CDATA[<p>Tudo bem Bruno.</p>
<p>Os parâmetros de um tipo genérico não implicam em uma hierarquia, ou seja, List&lt;String&gt; não extende List&lt;Object&gt;. Logo não dá para fazer esse cast de forma válida.</p>
<p>Fora isso, não dá para o compilador adivinhar se em um dado trecho de código, o correto são tipos lower-bound ou upper-bound. Tanto que precisamos informar isso explicitamente.</p>
<p>O compilador não tem como adivinhar, pois o contrato correto depende de como usarmos esses objetos. No teu exemplo, é feito um cast de List&lt;Object&gt; para List&lt;String&gt;, isso não dá para o compilador adivinhar sozinho, já que são tipos distintos, um não herda do outro.</p>
<p>No final das contas, wildcards são usadas principalmente para definir os parâmetros ou retorno de um método, e um método de uma classe genérica.</p>
<p>Existem algorítmos que permitiriam ao compilador adivinhar qual o wildcard correto, a linguagem ML faz isso ao máximo, só que isso acaba por confundir demais os desenvolvedores, que em alguns momentos ficam simplesmente perdidos tentando entender que maluquice o compilador assumiu.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Bruno</title>
		<link>http://www.kumpera.net/blog/index.php/2006/08/08/a-parte-bizarra-de-generics/comment-page-1/#comment-395</link>
		<dc:creator>Bruno</dc:creator>
		<pubDate>Fri, 25 Aug 2006 00:12:21 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/08/08/a-parte-bizarra-de-generics/#comment-395</guid>
		<description>Droga, não sei como escapar o html... mas deve dar pra imaginar que l1 é uma lista de Object e l2 é uma lista de String.</description>
		<content:encoded><![CDATA[<p>Droga, não sei como escapar o html&#8230; mas deve dar pra imaginar que l1 é uma lista de Object e l2 é uma lista de String.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Bruno</title>
		<link>http://www.kumpera.net/blog/index.php/2006/08/08/a-parte-bizarra-de-generics/comment-page-1/#comment-394</link>
		<dc:creator>Bruno</dc:creator>
		<pubDate>Fri, 25 Aug 2006 00:10:58 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/08/08/a-parte-bizarra-de-generics/#comment-394</guid>
		<description>Muito bom, parabéns pela explicação.

Mas ainda não entendo porque o compilador não aceita:&lt;code&gt;
		List l1 = new ArrayList();
		List l2 = new ArrayList();
		l1 = l2;
&lt;/code&gt;

O compilador não deveria saber que na atribuição o ‘contrato’ é de lower-bound type? E que é possível converter um List em um List?</description>
		<content:encoded><![CDATA[<p>Muito bom, parabéns pela explicação.</p>
<p>Mas ainda não entendo porque o compilador não aceita:<code><br />
		List l1 = new ArrayList();<br />
		List l2 = new ArrayList();<br />
		l1 = l2;<br />
</code></p>
<p>O compilador não deveria saber que na atribuição o ‘contrato’ é de lower-bound type? E que é possível converter um List em um List?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Bruno</title>
		<link>http://www.kumpera.net/blog/index.php/2006/08/08/a-parte-bizarra-de-generics/comment-page-1/#comment-393</link>
		<dc:creator>Bruno</dc:creator>
		<pubDate>Fri, 25 Aug 2006 00:10:03 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/08/08/a-parte-bizarra-de-generics/#comment-393</guid>
		<description>Muito bom, parabéns pela explicação.

Mas ainda não entendo porque o compilador não aceita:
		List l1 = new ArrayList();
		List l2 = new ArrayList();
		l1 = l2;

O compilador não deveria saber que na atribuição o &#039;contrato&#039; é de lower-bound type? E que é possível converter um List em um List?</description>
		<content:encoded><![CDATA[<p>Muito bom, parabéns pela explicação.</p>
<p>Mas ainda não entendo porque o compilador não aceita:<br />
		List l1 = new ArrayList();<br />
		List l2 = new ArrayList();<br />
		l1 = l2;</p>
<p>O compilador não deveria saber que na atribuição o &#8216;contrato&#8217; é de lower-bound type? E que é possível converter um List em um List?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: kumpera</title>
		<link>http://www.kumpera.net/blog/index.php/2006/08/08/a-parte-bizarra-de-generics/comment-page-1/#comment-292</link>
		<dc:creator>kumpera</dc:creator>
		<pubDate>Tue, 08 Aug 2006 15:10:35 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/08/08/a-parte-bizarra-de-generics/#comment-292</guid>
		<description>Valeu Michael, corrigido :)</description>
		<content:encoded><![CDATA[<p>Valeu Michael, corrigido :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Michael Nascimento Santos</title>
		<link>http://www.kumpera.net/blog/index.php/2006/08/08/a-parte-bizarra-de-generics/comment-page-1/#comment-291</link>
		<dc:creator>Michael Nascimento Santos</dc:creator>
		<pubDate>Tue, 08 Aug 2006 13:49:54 +0000</pubDate>
		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/08/08/a-parte-bizarra-de-generics/#comment-291</guid>
		<description>Louds, vc precisa fazer escaping dos caracteres &lt; e &gt;. Simplesmente nao faz sentido o post pra quem estah lendo :-)</description>
		<content:encoded><![CDATA[<p>Louds, vc precisa fazer escaping dos caracteres &lt; e &gt;. Simplesmente nao faz sentido o post pra quem estah lendo :-)</p>
]]></content:encoded>
	</item>
</channel>
</rss>
