Melhor usar o generic. Cast é sempre uma operação insegura. O método que aceita o objeto do tipo Class pode verificar se o que está sendo buscado é mesmo da classe que o programador quer, retornar a lista sem necessidade de cast, e disparar uma exceção imediatamente em caso de problemas.
Caso você não use generics, corre-se o risco de que a exceção da lista dispare muito longe do trecho de código onde ela foi requisitada. Por exemplo, pode ser que ela seja disparada dentro de um TableModel que está tentando desenhar a lista, e nem sequer você veja onde que a lista dentro daquele model foi carregada.
ul1sses
Outra dúvida minha, na qual você já deu uma alternativa Vini:
E se eu quiser evitar que na utilização do método sejam passados como parâmetro objetos que não sejam do tipo Class, não poderia utilizar <T extends Class> ?
ViniGodoy
Não, o correto seria fazer:
public static <T> List<T> buscarTodos(Class<T> classe) {
...
}
Pois note, você quer passar para o método um Class<String> e retornar um String.
Ou seja, T é um String e não um Class<String>