Olá Thiago
O generic do java é utilizado quando queremos criar uma classe que pode trabalhar com diversos tipos do java. Por exemplo, imagine que precisamos criar uma classe lista que pode guardar qualquer tipo de valor (Integer, String, Double, ...) mas com a seguinte restrição, se a lista for do tipo Integer, ela só deve aceitar inteiros.
Para implementar essa lista, poderíamos utilizar o tipo Object para conseguir guardar qualquer informação, mas não conseguiríamos garantir a segunda restrição (a lista de Integer só deve aceitar Integers).
Para resolver esse problema, precisamos colocar qual é o tipo que a lista deve guardar na declaração do tipo da lista, Lista<Integer>
e devemos implementar todos os métodos dessa lista recebendo e devolvendo o tipo que foi passado como argumento:
// T é o tipo passado na declaração da variável. Quando o
// usuário declara a variável como Lista<Integer>
// T será o tipo Integer
public class Lista<T> {
// No adiciona receberemos algo que é do tipo T:
public void adiciona(T valor){
// implementação
}
// pega o valor na posição i da lista.
// o valor é do tipo da lista, T.
public T recupera(int i){
// implementação
}
}
No caso do curso, estamos implementando um DAO que pode trabalhar com qualquer tipo de entidade, entidade do tipo T:
public class DAO<T>{
public void adiciona(T valor){
}
public T buscaPorId(Long id){
}
}
Dentro do método busca por id, precisamos utilizar o EntityManager para buscar a entidade no banco, mas para isso precisamos da classe da entidade, porém essa informação é descartada pelo compilador do java. E por isso, precisamos passar a classe no construtor do DAO.
Quando queremos utilizar esse DAO, precisamos do seguinte código:
// esse dao gerencia apenas contas
DAO<Conta> contaDAO = new DAO<Conta>(Conta.class);
// Então podemos utilizá-lo para adicionar uma conta
Conta c = new Conta();
// inicializa a conta
contaDAO.adiciona(c);
// Não podemos utilizá-lo nada que não seja uma conta:
Movimentacao m = new Movimentacao();
// a linha abaixo gera um erro de compilação!
contaDAO.adiciona(m);