DEV Community

FUNDAMENTOS JAVA
FUNDAMENTOS JAVA

Posted on

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.

AWS GenAI LIVE image

How is generative AI increasing efficiency?

Join AWS GenAI LIVE! to find out how gen AI is reshaping productivity, streamlining processes, and driving innovation.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs