<?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"
	>
<channel>
	<title>Comments on: Não posso descobrir nem instanciar tipos genéricos! Porque?</title>
	<atom:link href="http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/</link>
	<description>blog dos desenvolvedores da Caelum</description>
	<pubDate>Wed, 20 Aug 2008 06:24:07 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
		<item>
		<title>By: Marcelo Manzan</title>
		<link>http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-38309</link>
		<dc:creator>Marcelo Manzan</dc:creator>
		<pubDate>Fri, 16 May 2008 18:37:17 +0000</pubDate>
		<guid isPermaLink="false">http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-38309</guid>
		<description>É... inevitavelmente é precido estender a classe. Seria até melhor considerá-la abstrata na definição, evitando seu uso direto e obtendo erro apenas em tempo de execução. Isso pode ser incômodo, mas nem sempre...

Abraços!

PS.: Eu desconhecia o artigo anterior :-)</description>
		<content:encoded><![CDATA[<p>É&#8230; inevitavelmente é precido estender a classe. Seria até melhor considerá-la abstrata na definição, evitando seu uso direto e obtendo erro apenas em tempo de execução. Isso pode ser incômodo, mas nem sempre&#8230;</p>
<p>Abraços!</p>
<p>PS.: Eu desconhecia o artigo anterior <img src='http://blog.caelum.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paulo Silveira</title>
		<link>http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-38305</link>
		<dc:creator>Paulo Silveira</dc:creator>
		<pubDate>Fri, 16 May 2008 18:16:57 +0000</pubDate>
		<guid isPermaLink="false">http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-38305</guid>
		<description>Ola Mazan!

Isso é o que esta descrito aqui:
http://blog.caelum.com.br/2006/10/29/brincando-com-generics-o-bizarregenericdao/

Mas pra isso voce vai precisar estender a classe... um tanto incomodo.</description>
		<content:encoded><![CDATA[<p>Ola Mazan!</p>
<p>Isso é o que esta descrito aqui:<br />
<a href="http://blog.caelum.com.br/2006/10/29/brincando-com-generics-o-bizarregenericdao/" rel="nofollow">http://blog.caelum.com.br/2006/10/29/brincando-com-generics-o-bizarregenericdao/</a></p>
<p>Mas pra isso voce vai precisar estender a classe&#8230; um tanto incomodo.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Marcelo Manzan</title>
		<link>http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-38304</link>
		<dc:creator>Marcelo Manzan</dc:creator>
		<pubDate>Fri, 16 May 2008 18:12:23 +0000</pubDate>
		<guid isPermaLink="false">http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-38304</guid>
		<description>Um exemplo que pode dar certo.
&lt;code&gt;
public class Dao&#60;T&#62; {
	private Class&#60;?&#62; paramType;

	public Dao() {
		this.paramType = (Class&#60;?&#62;) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}
	@SuppressWarnings("unchecked")
	public T cria() throws Exception {
		return (T) this.paramType.newInstance();
	}
}
&lt;/code&gt;

Isso funciona bem, e pode ajudar a sanar algumas necessidades.
Abraços.</description>
		<content:encoded><![CDATA[<p>Um exemplo que pode dar certo.<br />
<code><br />
public class Dao&lt;T&gt; {<br />
	private Class&lt;?&gt; paramType;</p>
<p>	public Dao() {<br />
		this.paramType = (Class&lt;?&gt;) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];<br />
	}<br />
	@SuppressWarnings(&#8221;unchecked&#8221;)<br />
	public T cria() throws Exception {<br />
		return (T) this.paramType.newInstance();<br />
	}<br />
}<br />
</code></p>
<p>Isso funciona bem, e pode ajudar a sanar algumas necessidades.<br />
Abraços.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paulo Silveira</title>
		<link>http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-37729</link>
		<dc:creator>Paulo Silveira</dc:creator>
		<pubDate>Fri, 09 May 2008 01:50:55 +0000</pubDate>
		<guid isPermaLink="false">http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-37729</guid>
		<description>Ola Ronildo

Parece um tanto estranho voce ter de receber um objeto para poder listar todos aqueles objetos, nao concorda? Exemplo: Num Dao de funcionario generico, pra listar TODOS os funcionarios, eu preciso passar um como argumento.

E como ficaria para ler um Funcionario? Precisaria receber um ID e outro funcionario!!!!

É possivel sim buscar todos sem passar esse argumento estranho guardando o Class da classe... como no link do dao generico...

abracos!</description>
		<content:encoded><![CDATA[<p>Ola Ronildo</p>
<p>Parece um tanto estranho voce ter de receber um objeto para poder listar todos aqueles objetos, nao concorda? Exemplo: Num Dao de funcionario generico, pra listar TODOS os funcionarios, eu preciso passar um como argumento.</p>
<p>E como ficaria para ler um Funcionario? Precisaria receber um ID e outro funcionario!!!!</p>
<p>É possivel sim buscar todos sem passar esse argumento estranho guardando o Class da classe&#8230; como no link do dao generico&#8230;</p>
<p>abracos!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: ronildo braga</title>
		<link>http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-37721</link>
		<dc:creator>ronildo braga</dc:creator>
		<pubDate>Thu, 08 May 2008 23:38:50 +0000</pubDate>
		<guid isPermaLink="false">http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-37721</guid>
		<description>Paulo

Ei li os seus artigo, e depois li o artigo do GenericDao do hibernate e me ficou a impressão que não é possivel criar um método generico para buscar todos os registros.

A solução do hibernate me parece muito complicada, não seria mais facil fazer desta forma?
public List listAll(T entity){
     Criteria crit = getSession().createCriteria(entity.getClass());
...
}</description>
		<content:encoded><![CDATA[<p>Paulo</p>
<p>Ei li os seus artigo, e depois li o artigo do GenericDao do hibernate e me ficou a impressão que não é possivel criar um método generico para buscar todos os registros.</p>
<p>A solução do hibernate me parece muito complicada, não seria mais facil fazer desta forma?<br />
public List listAll(T entity){<br />
     Criteria crit = getSession().createCriteria(entity.getClass());<br />
&#8230;<br />
}</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Gabriel</title>
		<link>http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-37563</link>
		<dc:creator>Gabriel</dc:creator>
		<pubDate>Wed, 07 May 2008 05:47:47 +0000</pubDate>
		<guid isPermaLink="false">http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-37563</guid>
		<description>A solução da herança é boa e eu uso bastante. Por sinal, comecei a usá-la em .NET antes de aplicá-la no Java. Gosto como ela torna o código mais limpo (principalmente as instanciações). Mas insisto que esses joguinhos para descobrir qual o tipo usado num generic tendem a revelar que algo está mal no código. Exceto por algum tipo de framework, a maior parte do código simplesmente não precisa usar isso, nem qualquer forma de reflexão. Se os tipos estão limitando ou sujando o projeto, talvez seja mais natural usar uma linguagem dinâmica, na qual isso seja natural, como Perl.</description>
		<content:encoded><![CDATA[<p>A solução da herança é boa e eu uso bastante. Por sinal, comecei a usá-la em .NET antes de aplicá-la no Java. Gosto como ela torna o código mais limpo (principalmente as instanciações). Mas insisto que esses joguinhos para descobrir qual o tipo usado num generic tendem a revelar que algo está mal no código. Exceto por algum tipo de framework, a maior parte do código simplesmente não precisa usar isso, nem qualquer forma de reflexão. Se os tipos estão limitando ou sujando o projeto, talvez seja mais natural usar uma linguagem dinâmica, na qual isso seja natural, como Perl.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paulo Silveira</title>
		<link>http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-37554</link>
		<dc:creator>Paulo Silveira</dc:creator>
		<pubDate>Wed, 07 May 2008 04:56:04 +0000</pubDate>
		<guid isPermaLink="false">http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-37554</guid>
		<description>Vale a pena dar uma olhada na sugestao de GenericDao do hibernate:
http://www.hibernate.org/328.html

Usar esse truque de ter de estender a classe eu acho muito antinatural, até comentei dele aqui:
http://blog.caelum.com.br/2006/10/29/brincando-com-generics-o-bizarregenericdao/</description>
		<content:encoded><![CDATA[<p>Vale a pena dar uma olhada na sugestao de GenericDao do hibernate:<br />
<a href="http://www.hibernate.org/328.html" rel="nofollow">http://www.hibernate.org/328.html</a></p>
<p>Usar esse truque de ter de estender a classe eu acho muito antinatural, até comentei dele aqui:<br />
<a href="http://blog.caelum.com.br/2006/10/29/brincando-com-generics-o-bizarregenericdao/" rel="nofollow">http://blog.caelum.com.br/2006/10/29/brincando-com-generics-o-bizarregenericdao/</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paulo Silveira</title>
		<link>http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-37553</link>
		<dc:creator>Paulo Silveira</dc:creator>
		<pubDate>Wed, 07 May 2008 04:52:38 +0000</pubDate>
		<guid isPermaLink="false">http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/#comment-37553</guid>
		<description>Gabriel. O exemplo foi puramente ilustrativo, mas existem casos que seria muito interessante dar new em uma array de T. No seu exemplo voce tem um objeto do tipo T, mas imagine o metodo busca() de um DAO, onde voce nao tem um T para pegar o getClass em tempo de execucao? Nao da...

Não faz sentido algum o DAO criar um objeto T, mas como disse faz todo o sentido precisar da classe de T para invocar o metodo load/find da Session/EntityManager do Hibernate/JPA. Nesse caso você precisa do tipo reificado.

Como no Java não há, faz-se necessario passar a classe de T para o DaoGenerico, o que fica parecendo bem redundante ao se ler o código.

Eu me simpatizo com a implementação da Microsoft, mas como não tenho experiência no desenvolvimento .NET, pode ser apenas o efeito de que a "grama do vizinho é mais verde".</description>
		<content:encoded><![CDATA[<p>Gabriel. O exemplo foi puramente ilustrativo, mas existem casos que seria muito interessante dar new em uma array de T. No seu exemplo voce tem um objeto do tipo T, mas imagine o metodo busca() de um DAO, onde voce nao tem um T para pegar o getClass em tempo de execucao? Nao da&#8230;</p>
<p>Não faz sentido algum o DAO criar um objeto T, mas como disse faz todo o sentido precisar da classe de T para invocar o metodo load/find da Session/EntityManager do Hibernate/JPA. Nesse caso você precisa do tipo reificado.</p>
<p>Como no Java não há, faz-se necessario passar a classe de T para o DaoGenerico, o que fica parecendo bem redundante ao se ler o código.</p>
<p>Eu me simpatizo com a implementação da Microsoft, mas como não tenho experiência no desenvolvimento .NET, pode ser apenas o efeito de que a &#8220;grama do vizinho é mais verde&#8221;.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
