Tipo Generico dado, Por que não consigo pegar o objeto

4 respostas
MarceloNeo

Boa tarde galera tenho uma classe generica!

public class SysDaoGenericOperators<T> extends SysDaoGeneric<T>{
.
.
.
    public List<SysDaoGenericOperators<?>> listGeneric(String sqlNameConsult, SysDaoGenericOperators<?> dao){
     /*
        Este metodo retona qualquer tipo de Bean
     */
             EntityManager emUsers=dao.getEntityManager();	   
	     List listaGeneric=(ArrayList<SysDaoGenericOperators<?>>)emUsers.createNamedQuery(sqlNameConsult).setFirstResult(1).setMaxResults(10).getResultList();
	     return listaGeneric; 


    }
}
Classe que executa!
public class teste
{
.
.
.
    public List<SysUsers> findByDescriptionObj()
	{		
		SysDaoGenericOperators<SysUsers> daoUser= new SysDaoGenericOperators<SysUsers>(SysUsers.class);
		Collection <SysDaoGenericOperators<?>>colGeneric=daoUser.listGeneric("SysUsers.findAll", daoUser);
		Iterator<SysDaoGenericOperators<?>> itUser= colGeneric.iterator();
		List <SysUsers> listUser= new ArrayList<SysUsers>();
		while (itUser.hasNext())
                {			
			itUser.next();	                
                }
		return listUser;
	}  
}

Se eu tento colocar o objeto do Iterator na lista listUser ele não aceita!
Se faço o Debug o Objeto que tenho é do Tipo SysUsers;
Mas ele entende que o tipo é SysDaoGenericOperators, e simplesmente da erro e não consigo nem pegar e fazer o cast!

Alguma dica?

Duvidas podem questionar, não coloquei toda a classe por que o projeto é complicado!

4 Respostas

Gustavokt

Você não consegue definir que o tipo do listGeneric é T?

Em vez de
public List<SysDaoGenericOperators<?>> listGeneric(String sqlNameConsult, SysDaoGenericOperators<?> dao){

public List<SysDaoGenericOperators> listGeneric(String sqlNameConsult, SysDaoGenericOperators<?> dao){

Gustavokt

Aliás, para trabalhar com o iterator que você declarou, o listGeneric não deveria devolver a lista de SysUsers?

MarceloNeo

Sim, ele devolve mas não consigo por exemplo fazer isso:

SysUsers = itUser.next(); // gera erro por que diz que o objeto é SysDaoGenericOperators

Fiz a alteração que você sugeriu,

Ainda não resolvi, Obrigado pela dicas!

MarceloNeo

A principio resolvi dessa forma!

@SuppressWarnings("unchecked")
 public List<SysUsers> findByDescriptionObj()
	{		
		SysDaoGenericOperators<SysUsers> daoUser= new SysDaoGenericOperators<SysUsers>(SysUsers.class);
		// O SuppressWarnings incobre o valor que retorna da lista
		List<SysUsers> listGeneric=(List<SysUsers>) daoUser.listGeneric("SysUsers.findAll", daoUser);		
		return listGeneric;
	}

mas, não é como eu desejava, tem tipagem fraca
A lista retornada, não garante um Tipo especifico de dado!

Isso não tem problema algum, mas queria controlar isso para quando um programador for desenvolver algo.
ele não cometa esse erro!

mas, vai ter que ficar pra outra hora, até eu conseguir achar uma solução, e entender o erro que estou comentendo.

Comentários são bem vindo!

Criado 23 de abril de 2010
Ultima resposta 23 de abr. de 2010
Respostas 4
Participantes 2