Erro de generics :: Passando parametros para classes <T>

Pessoal,

Tenho o seguinte cenário :

public interface BaseDao<T> { ... }

public abstract class BaseDaoImpl<T> implements BaseDao<T> {

	public BaseDaoImpl() {
		this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
				.getGenericSuperclass()).getActualTypeArguments()[0];
	}

	public T recuperar( Serializable id ) {
		return (T)this.hibernateTemplate.get(persistentClass, id);
	}
}

public abstract class AbstractFuncionarioDao<T> extends BaseDaoImpl<T> { ... }

public class FuncionarioDaoImpl extends AbstractFuncionarioDao<Funcionario> { ... }

public class Funcionario implements Serializable { ... }

Qdo eu efetuo a chamada do método recuperar da classe BaseDaoImpl através da minha classe de serviço :


public class ControlarFuncionarioServiceImpl implements IControlarFuncionarioService {

	private AbstractFuncionarioDao dao;
	
	/**
	 * Construtor default do objeto ControlarFuncionarioServiceImpl
	 * @param dao
	 * @spring.constructor-arg ref="funcionarioDao"
	 */
	public ControlarFuncionarioServiceImpl( AbstractFuncionarioDao dao ) {
		this.dao = dao;
	}

	public Funcionario recuperar(Long id) {
		return dao.recuperar(id);
	}

}

… Está sendo gerado um erro de compilação solicitando cast de Object para Funcionario.
Usando generics isso não deveria acontecer né ?!?

Alguém sabe como eu posso resolver este problema ? Sem dar o cast ?

Obrigado;

Marcio,

O teu problema é que tu declarou o parametro da classe ControlerFuncionarioServiceImpl como AbstractFuncionarioDao e esta classe tem um tipo generico e tu nao esta passando ele.

public ControlarFuncionarioServiceImpl( AbstractFuncionarioDao<Funcionario> dao ) { this.dao = dao; }

A solicitacao de Cast é por isso.
Fora isso eu acho que tua arquitetura tem alguns detalhes que podem melhorar. Nao vejo necessidade para ter uma classe abstrata de funcionario e mais uma implementacao.

Tu nao tem interfaces para os Dao’s? Daria pra fazer assim tambem

public interface FuncionarioDao extends BaseDao<Funcionario> {...}

Ai na classe ControlarFuncionarioServiceImpl nao precisaria passar o tipo generico.

public ControlarFuncionarioServiceImpl( FuncionarioDao dao ) { this.dao = dao; }

]['s

Que tal:

public class ControlarFuncionarioServiceImpl implements IControlarFuncionarioService {
 
 	private AbstractFuncionarioDao<Funcionario> dao;
 	
 	public ControlarFuncionarioServiceImpl( AbstractFuncionarioDao<Funcionario> dao ) {
 		this.dao = dao;
 	}
 
 	public Funcionario recuperar(Long id) {
 		return dao.recuperar(id);
 	}
 
 }

Galera … mto obrigado pela ajuda …

Eu estou usando este monte de interfaces e classes abstratas pq estou usando o struts integrado com o spring e hibernate.

Eu sei q acaba deixando um pouco mais complicado, mas no final da história, atende perfeitamente.

Obrigado,