Erro com Generics

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&lt;T&gt;) ((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,

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&lt;T&gt; persistentClass;

@SuppressWarnings("unchecked")
public Dao(ObjectContainer session) {
	this.session = session;
	this.persistentClass = (Class&lt;T&gt;) ((ParameterizedType) (getClass()
			.getGenericSuperclass())).getActualTypeArguments()[0];
}

public Class&lt;T&gt; 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&lt;T&gt; set = q.execute();
	if (set.hasNext())
		return (set.next());
	return null;
}

@SuppressWarnings("unchecked")
public List&lt;T&gt; findByExample(T t) {
	return (List&lt;T&gt;) this.session.get(t);
}

public ObjectSet&lt;T&gt; findAll() {
	return this.session.query(this.persistentClass);
}

public void delete(T u) {
	this.session.delete(u);
	this.session.commit();
}

public void deleteAll() {
	for (ObjectSet&lt;T&gt; os = (ObjectSet&lt;T&gt;) 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