O Que é Erasure?
- Erasure é a técnica usada pelo Java para implementar genéricos, garantindo a compatibilidade retroativa com versões anteriores da linguagem.
- Durante a compilação, todas as informações de tipos genéricos são *removidas *(ou "apagadas").
2. Motivação para o Uso do Erasure
Compatibilidade com códigos legados:
- A introdução dos genéricos no Java (JDK 5) não deveria invalidar códigos mais antigos.
- O design dos genéricos precisava garantir que tanto códigos genéricos quanto não genéricos funcionassem juntos sem problemas.
Coerções apropriadas:
- O compilador adiciona coerções para garantir a compatibilidade de tipos com os argumentos fornecidos.
- Remoção de informações de tipos genéricos:
- Os parâmetros de tipo existem apenas no código-fonte, mas não no tempo de execução.
4. Exemplo de Erasure em Ação
- Código genérico:
class Gen<T> {
T ob;
Gen(T o) {
ob = o;
}
T getOb() {
return ob;
}
}
- Código após erasure (como o compilador o transforma):
class Gen {
Object ob;
Gen(Object o) {
ob = o;
}
Object getOb() {
return ob;
}
}
Notas:
- O parâmetro de tipo é substituído por Object.
- Não há informações genéricas disponíveis no código gerado.
5. Limitações do Erasure
Ausência de informações de tipo no tempo de execução:
- Os tipos genéricos são um mecanismo de código-fonte e não existem após a compilação.
Não é possível:
- Obter o tipo genérico de uma instância em tempo de execução.
- Criar instâncias de tipos genéricos diretamente (ex.: new T() não é permitido).
6. Impacto Prático
O erasure explica:
- Por que genéricos não possuem sobrecarga: Métodos com assinaturas diferentes apenas pelos tipos genéricos não são permitidos.
- Por que não é possível usar tipos primitivos diretamente em genéricos (ex.: Gen não é válido; deve-se usar Gen).
Segurança em tempo de compilação:
- Embora as informações de tipo sejam apagadas, o compilador verifica a compatibilidade de tipos durante a compilação.
7. Conclusão
- O uso do erasure permitiu que os genéricos fossem adicionados ao Java sem comprometer a compatibilidade retroativa.
- Apesar de algumas limitações, os genéricos oferecem segurança de tipo em tempo de compilação, enquanto o código gerado permanece compatível com versões anteriores da JVM.
Top comments (0)