O recurso de tipos genéricos em Java permite soluções interessantes de economia de código ao definir classes e métodos de manipulação ou utilitários genéricos, mas que ao serem instanciados e usados podem ter um tipo específico definido. os tipos genéricos trazem a flexibilidade e generalidade da classe Object, porém com permitindo usos com verificação de tipo mais restrita, em tempo de compilação.
Em um artigo de 2004 em que eu falava das novidades que o Java 5 “Tiger” trazia, Prepare-se para o Tigre, havia um exemplo de uso básico de genéricos.
Existem casos complicados, em que a compreensão do funcionamento e uso dos tipos genéricos é mais difícil. No artigo Wildcard Generics (em inglês, por Marco, 17/11/2006), o autor ressalta um dos pontos menos intuitivo do recurso de tipos genéricos em Java, conforme indica o próprio Tutorial da Sun Generics in the Java Programming Language (PDF, em inglês, 5/07/2004), por Gilad Bracha:
“Em geral, se
Foo
é um subtipo (subclasse ou subinterface) deBar
, eG
é alguma declaração de tipo genérico, não é correto afirmar queG<Foo>
seja um subtipo deG<Bar>
. Esta provavelmente é a coisa mais difícil que você deve aprender sobre genéricos, porque vai contra nossa mais profunda intuição.”
Outra situação que merece atenção é código que utiliza APIs mais antigas — sem genéricos — ou com tipos apagados (“erased”), com código compilado dentro da validação de sintaxe de Java 5 ou superior, com genéricos. Um exemplo de como evitar o aviso de compilação de verificação de tipo insegura sobre tipos apagados pode ser visto neste tópico do Fórum da Sun sobre Desenvolvimento Java: Checking against the erased type List.