Estudamos anteriormente as coleções e nos deparamos com classes ArrayList e LinkedList que recebiam um argumento especial que correspondia a um tipo de dado:
List<int> valores = new ArrayList<int>();
Nesse trecho de código estamos criando um objeto do tipo ArrayList para dados do tipo int. Algumas classes exigem esse tipo de parametrização, ou seja, a especificação do tipo de dado a ser usado pelo objeto.
A classe ArrayList é um exemplo dessa parametrização, mas no pacote java.util, existem muitas outras classes genéricas, principalmente, as classes que representam coleções que precisam saber o tipo da dado a ser processado (Vector, LinkedList etc.). Essas classes são genéricas no sentido que tomam como parâmetro um tipo de dado (classe ou interface) qualquer E. O E é semelhante a uma variável que recebe como valor o tipo de dado. Podemos ver abaixo um exemplo do pacote java.util.ArrayList:
package java.util ; public class ArrayList<E> extends AbstractList<E> implements List<E>, ... { ... public boolean add(E e) { ... } ... }
Nós podemos notar que o tipo passado como parâmetro é indicado entre os símbolos <> (Ex.: <E>) e pode ser reutilizado pela classe dentro de métodos (Exemplo: método set()). No caso anterior o método Add define como parâmetro um valor do tipo E. Por exemplo, a função Collections.sort(List<T>) ordena os elementos de uma lista.