Como o Java pode ser aprimorado para não precisar mais executar apagamento de tipo?

16

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".

um usuário
fonte
1
O Sun 1.4 foi EOL'ed. A IBM ainda suporta 1.4 em suas plataformas.
@ ThorbjørnRavnAndersen: E pelo menos para a plataforma que fica no porão do meu pai, não 1,5.
Jörg W Mittag
@ ThorbjørnRavnAndersen Não apenas isso, mas também é possível adquirir suporte estendido para versões muito mais antigas da JVM. A última vez que ouvi, embora seja bastante caro.
Maple_shaft
1
Nenhum de nós aqui possui uma bola de cristal, portanto, não é responsável. Talvez possa ser reaberto se você reformular a pergunta de uma pergunta "Haverá sempre ..." para uma "O que precisa ser realizado para que o Type Erasure seja executado em uma versão futura do Java"
maple_shaft
@ JörgWMittag, seria uma plataforma realmente usada para produção em 2012?

Respostas:

7

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.

Jan Hudec
fonte
6
A equipe do OpenJDK discutiu a possibilidade de olhar para os genéricos reificados novamente, prazo? É mais provável que seja encarado com seriedade durante o período de tempo do Java 9 e, se for tecnicamente possível, entregue no período de tempo do Java 10. Mas isso é algo sério da minha parte.
Martijn Verburg
O apagamento do tipo é feito pelo compilador, não pela JVM. A introdução de genéricos reificados exigiria um novo compilador e uma nova JVM, mas presumivelmente eles ainda funcionariam com código antigo.
Gabe
@Gabe: Obviamente, eles seriam introduzidos em uma nova versão, então haveria um novo compilador e uma nova JVM. Mas também requer a duplicação de parte significativa da biblioteca padrão, porque seria necessário versões genéricas para novo código e versões não genéricas para compatibilidade com versões anteriores. O .NET fez exatamente isso na versão 2.0, o Java evitou-o com apagamento. O .NET possui tipos de valor (struct) e o suporte de primeira classe a eles exclui o apagamento do tipo. Java não, então a pressão por genéricos reificados é muito menor.
Jan Hudec
Jan: Eu estava apenas comentando o fato de que reificar genéricos não significa automaticamente que todo código antigo está quebrado. Eu também acrescentaria que um List<int>provavelmente tornaria certamente as cargas de trabalho muito mais eficientes do que as atuais List<Integer>.
Gabe
@ Gabe: Nós não discordamos nisso. Eu só queria observar a principal desvantagem.
Jan Hudec