Suponhamos que temos as seguintes classes:
[code]
class TbPessoaBean implements Bean {…}
class EnderecoBean implements Bean {…}
class PaisBean implements Bean {…}
class QualquerNomeAquiBean implements Bean {…}
[/code] 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<capture#1-of ? extends Bean> 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
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
Tenta isso:
class GenericDao {
public <E extends Bean> List<E> get(Class<E> clazzBean) {
return null; // Aqui faz a consulta e retorna um List<E>.
}
}
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.