O tutorial oficial do Java sobre genéricos explica o apagamento de tipo e por que foi adicionado ao compilador:
Quando um tipo genérico é instanciado, o compilador converte esses tipos por uma técnica chamada apagamento de tipo - um processo em que o compilador remove todas as informações relacionadas aos parâmetros e argumentos de tipo em uma classe ou método. O apagamento de tipo permite que aplicativos Java que usam genéricos mantenham a compatibilidade binária com bibliotecas e aplicativos Java que foram criados antes dos genéricos.
Provavelmente era uma abordagem pragmática, ou talvez a menos dolorosa. No entanto, agora que os genéricos são amplamente suportados em todo o setor, o que pode ser feito para não precisarmos de apagamento de tipo? É possível sem precisar quebrar a compatibilidade com versões anteriores ou, se for possível, é prático?
A última declaração da citação acima se tornou auto-referencial? Ou seja: "apagamento de tipo permite que aplicativos Java que usam genéricos mantenham a compatibilidade binária com bibliotecas Java e aplicativos que foram criados com versões Java que executam apagamento de tipo".
Respostas:
O fim da vida útil se aplica ao Java Development Toolkit e ao Java Runtime Environment. E apenas as versões Oracle (Sun). Mas isso não se aplica a aplicativos elaborados por terceiros. A intenção é nunca quebrar o código que já foi executado na JVM, portanto, é improvável que o Java pare de apagar o tipo.
É claro que o C # também introduziu genéricos em versões posteriores de maneira compatível com versões anteriores sem fazer o apagamento de tipo, mas basicamente significava duplicar todas as classes de coleção. O que suponho é o que os designers de Java não querem fazer e, portanto, por que eles escolheram o apagamento de tipo em primeiro lugar. Sem tipos de valor, a vantagem dos genéricos não apagados não é tão grande.
fonte
List<int>
provavelmente tornaria certamente as cargas de trabalho muito mais eficientes do que as atuaisList<Integer>
.