DEV Community

Erasure (Apagamento de Tipos)

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;
    }
}

Enter fullscreen mode Exit fullscreen mode
  • Código após erasure (como o compilador o transforma):
class Gen {
    Object ob;

    Gen(Object o) {
        ob = o;
    }

    Object getOb() {
        return ob;
    }
}

Enter fullscreen mode Exit fullscreen mode

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)