Tudo bem.
Olhe com atenção o que você usar para retornar o resultado de sua busca.
TypedQuery q = em.createQuery(cq);
Collection elementos = q.getResultList(); //Retorna uma Lista, interface List.
return elementos;
Agora olhe o seu método
public class CRUD <E extends Collection>
public E getAllGenerico(Class classe);
O erro que você tem é que você não pode converter collection para o tipo generico E.
Como ja que o meu E é uma classe filha de collection?
O que acontece é que mesmo E sendo filha de collection ela não é, necessariamente, uma List, e se eu tentasse pedir um Set ?
TreeSet<Barco> lista = new CrudCliente<TreeSet<Barco>>.getAllGenerico();
O que aconteceria é um erro, pois uma list não pode sofrer Cast para um Set. adicione um Cast no seu return e você vera exatamento isso.
Vou usar a primeira classe pois é mais simples… mas use a segunda tambem.
public class CrudCliente<T extends Collection> {
public T getAllGenerico() {
Collection x = new ArrayList();
return (T)x;
}
}
Agora tenta executar o codigo acima, o do TreeSet, então o que aconteceu? Um erro, pois como eu ja disse uma List não pode ser Convertida para um Set, tanto que sua IDE deve dar um aviso quando você faz o cast no return, é por isso que mesmo herdando collection o seu retorno não é valido, pois a lista não é o tipo generico T.
Mas e se o meu tipo generico T for uma list?
Caso você faça o cast no return não havera problemas, mas sem o cast não ha como verificar isso na hora que você compila sua classe.