Isto é possível no Generics?

3 respostas
rodrigo_corinthians
Suponhamos que temos as seguintes classes:
class TbPessoaBean implements Bean {...}

class EnderecoBean implements Bean {...}

class PaisBean implements Bean {...}

class QualquerNomeAquiBean implements Bean {...}
Queria fazer um get genérico da seguinte maneira:
class GenericDao {
   public List<? extends Bean> get(Clazz<?> clazzBean) {
      return null; // Aqui faz a consulta e retorna um List<? extends Bean>.
   }
}
Chamando o método get da seguinte forma abaixo da erro Type mismatch: cannot convert from List to List.
List<TbPessoaBean> list = genericDao.get(TbPessoaBean.class);
E quando forço o cast funciona normalmente.
List<TbPessoaBean> list = (List<TbPessoaBean>) genericDao.get(TbPessoaBean.class);

Gostaria de chamar o método acima sem precisar forçar o cast, alguém sabe como faço isso com Generics??

Obrigado

3 Respostas

sapulha

Eu uso da seguinte forma:

class GenericDao<MyBean extends Bean> {  
  public List<MyBean> get(Clazz<?> clazzBean) {  
    return null; // Aqui faz a consulta e retorna um List<? extends Bean>.  
  }  
 }

E depois uso da seguinte forma:

GeneriDAO<TbPessoaBean> generiDAO = new GenericDAO<TbPessoaBean>();
      List<TbPessoaBean> list = genericDao.get(TbPessoaBean.class);

Dessa forma não preciso usar o Cast

victorwss

Tenta isso:

class GenericDao {  
   public &lt;E extends Bean&gt; List&lt;E&gt; get(Class&lt;E&gt; clazzBean) {  
      return null; // Aqui faz a consulta e retorna um List&lt;E&gt;.  
   }  
}
leandro.anjos

Só pra completar, eu aconselho a utilizar a forma do sapulha. Mas pra ficar mais generico ficaria assim:

class GenericDao<T extends Bean> {    
       private Class<T>	persistentClass;
	
       public GenericDao() {
		this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
				.getGenericSuperclass()).getActualTypeArguments()[0];		
	}

       public List<T> listarTudo() {    
               return getSession().createCriteria(this.persistentClass).list();
       }    
 }

OBS: Os meus beans sempre EXTENDERAM o Bean, ou AbstractBean ou AbstractVO, nunca IMPLEMENTARAM, esse também pode ser o problema.

Criado 20 de maio de 2008
Ultima resposta 20 de mai. de 2008
Respostas 3
Participantes 4