Generics
O recurso de classes genéricas foi introduzido na versão 5 do Java SE. Este recurso permite que você escreva código mais seguro e fácil de ler em comparação com o código que faz uso de variáveis do tipo Object e de casts(conversões “forçadas” de tipos). Programação genérica é a escrita de código que pode ser reutilizado por objetos de diferentes tipos.
Inconvenientes antes da programação genérica
Antes das classes genéricas serem adicionadas à linguagem Java, este tipo de programação era feito utilizando herança. A classe ArrayList, por exemplo, havia sido desenvolvida para armazenar instâncias de qualquer classe-filha de Object. O exemplo abaixo supõe que já existem no projeto as classes Aeronave e Cachorro:
ArrayList listaAero = new ArrayList();
Aeronave a = new Aeronave(); listaAero.add(a); Aeronave b = new Aeronave(); listaAero.add(b); ArrayList listaCaes = new ArrayList();
Cachorro c = new Cachorro(); listaCaes.add(c); Cachorro d = new Cachorro(); listaCaes.add(d); Um inconveniente desta abordagem é a necessidade de realizar um cast para recuperar um valor da lista:
Aeronave x = (Aeronave) listaAero.get(0);
O usual é o programador utilizar cada lista para armazenar instâncias de um mesmo tipo. No entanto, nada impede que ele armazene instâncias de diferentes tipos em uma mesma lista:
ArrayList lista = new ArrayList();
Aeronave a = new Aeronave(); lista.add(a); Cachorro c = new Cachorro(); lista.add(c); // a linha abaixo irá gerar um erro somente na execução
Aeronave x = (Aeronave) lista.get(1);
A compilação do código acima não irá gerar nenhum erro, mas ocorrerá um erro durante a execução devido ao casting.
A solução: type parameters
A partir da versão 5 do Java SE, a classe ArrayList passou a ter um type parameter que indica o tipo do elemento que será armazenado na lista:
ArrayList listaAeronave = new ArrayList();
Isto torna o código mais fácil de ler, pois deixa claro que esta lista