Erro com Generics

6 respostas
G
Tenho o seguinte trecho de código, baseado neste exemplo, estou tentando pegar a classe do parâmetro 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];
	}
Está me retornando o erro:
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
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,,

6 Respostas

T

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?

G
Olá Thingol, Fiz a alteração nos parênteses, ocorre o mesmo erro (linha 21). Classe Dao<T>:
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&lt;T&gt; implements GenericDAO&lt;T&gt; {

	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();
	}
}
J

Olá a todos!

Esse problema foi resolvido? Estou com o mesmo problema…

G

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.

J

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.

Valeu!!! Essa dica foi muito importante.
Obrigado
[]s

R

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

Criado 22 de novembro de 2007
Ultima resposta 12 de abr. de 2009
Respostas 6
Participantes 4