Tipos primitivos em Generics

Boa dia galera.

A minha dúvida é a seguinte: Por que eu não posso utilizar tipos primitivos em Generics?

Um exemplo:

  • Dá erro:
HashMap<double, Vertice> estacao = new HashMap<>();
  • Funciona:
HashMap<Double, Vertice> estacao = new HashMap<>();

Abraços. :wink:

Porque tipo primitivo não é uma classe, logo não pode ser passado como argumento para algo que espera uma classe.

Obrigado Diego. :wink:

Por que é uma deficiência da forma como generics foram implantados na linguagem.
Outras linguagens, como C++ e C# não sofrem desse problema.

Para manter a compatibilidade com versões anteriores da linguagem, o java implementou um conceito chamado de type erasure.
Ou seja, o tipo genérico é um truque de compilação, e não tanto uma estrutura real da linguagem. Os tipos genéricos são verificados, mas no final acabam convertidos para um Object, como era antes do generic existir. Como tipos primitivos não podem ser convertidos dessa forma, e precisariam de uma forma de boxing (ou seja, usando as wrappers Integer, Double, etc), proibiu-se generics de tipos primitivos.

Outros recursos interessantes, como chamar o construtor do tipo genérico também se perdem com essa abordagem.

Aqui tem uma lista de outras restrições:
http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html