Tenho o seguinte trecho de código, baseado neste exemplo , estou tentando pegar a classe do parâmetro T:
[code] private ObjectContainer session;
private Class<T> persistentClass;
@SuppressWarnings("unchecked")
public Dao(ObjectContainer session) {
this.session = session;
this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}[/code] Está me retornando o erro:
Utilizo o java 6. Por que esse problema com o cast? Existe alguma outra forma para descobrir qual a classe T, ou preciso passá-la como parâmetro adicional no construtor?
Grato por sua ajuda,
thingol
Novembro 22, 2007, 11:29am
#2
a) Você tem um problema de parênteses
O que você fez:
((ParameterizedType) getClass()
.getGenericSuperclass())
O que deveria ser:
((ParameterizedType) (getClass()
.getGenericSuperclass()))
b) Poste a definição completa da sua classe. Ela é class Dao<T> ou outra coisa?
Olá Thingol,
Fiz a alteração nos parênteses, ocorre o mesmo erro (linha 21).
Classe Dao<T>:
[code]package dao;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.query.Query;
import domain.Idable;
public class Dao<T> implements GenericDAO<T> {
private ObjectContainer session;
private Class<T> persistentClass;
@SuppressWarnings("unchecked")
public Dao(ObjectContainer session) {
this.session = session;
this.persistentClass = (Class<T>) ((ParameterizedType) (getClass()
.getGenericSuperclass())).getActualTypeArguments()[0];
}
public Class<T> getPersistentClass() {
return persistentClass;
}
public T makePersistent(T u) {
if (u instanceof Idable) {
Idable idOb = (Idable) u;
Db4oObjectPool.getInstance().assignId(session, idOb);
}
this.session.set(u);
this.session.commit();
return u;
}
@SuppressWarnings("unchecked")
public T findById(Object id) {
Query q = this.session.query();
q.constrain(this.persistentClass);
q.descend("id").constrain(id);
ObjectSet<T> set = q.execute();
if (set.hasNext())
return (set.next());
return null;
}
@SuppressWarnings("unchecked")
public List<T> findByExample(T t) {
return (List<T>) this.session.get(t);
}
public ObjectSet<T> findAll() {
return this.session.query(this.persistentClass);
}
public void delete(T u) {
this.session.delete(u);
this.session.commit();
}
public void deleteAll() {
for (ObjectSet<T> os = (ObjectSet<T>) findAll(); os.hasNext();) {
T t = os.next();
this.session.delete(t);
}
this.session.commit();
}
}[/code]
Olá a todos!
Esse problema foi resolvido? Estou com o mesmo problema…
Esse artigo do Paulo Silveira esclarece o assunto: http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/ . Nesse outro post é mencionada uma possível solução: http://blog.caelum.com.br/2006/10/29/brincando-com-generics-o-bizarregenericdao/ .
Eu optei por passar a classe como parâmetro no construtor do Dao genérico.
Gf.
[quote=genildof]Esse artigo do Paulo Silveira esclarece o assunto: http://blog.caelum.com.br/2008/04/28/nao-posso-descobrir-nem-instanciar-tipos-genericos-porque/ . Nesse outro post é mencionada uma possível solução: http://blog.caelum.com.br/2006/10/29/brincando-com-generics-o-bizarregenericdao/ .
Eu optei por passar a classe como parâmetro no construtor do Dao genérico.
Gf.[/quote]
Valeu!!! Essa dica foi muito importante.
Obrigado
[]s
Não há como “descobrir a classe T” pois o compilador não leva essa informação para o bytecode. O Generics é um recurso de compilação e não de runtime. Veja este tópico: http://www.guj.com.br/posts/list/122984.java