Entendendo a Type Erasure em Generics
Java usa a Eliminação de Tipos (Type Erasure) em Genéricos para garantir que nenhuma sobrecarga adicional seja necessária em tempo de execução. O compilador substitui o parâmetro de tipo pela classe Object ou pela classe pai (no caso de Genéricos limitados) durante o processo de eliminação de tipos. No bloco de código a seguir, veremos como os Genéricos funcionam com tipos primitivos em tempo de compilação e tempo de execução.
// ~/project/Main.java
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> integerList = new ArrayList<Integer>();
integerList.add(1);
integerList.add(2);
integerList.add(3);
int sum = 0;
for (int i = 0; i < integerList.size(); i++) {
sum += integerList.get(i);
}
System.out.println(sum);
}
}
Para executar o código, abra o terminal e navegue até o diretório ~/project. Compile o código com o seguinte comando:
javac Main.java
Após a compilação bem-sucedida, execute o código com o seguinte comando:
java Main
A saída do código será:
6
No bloco de código acima, tentamos adicionar os elementos do integerList. Como sabemos, tipos primitivos como int não podem ser usados com Genéricos. Devido à eliminação de tipos, o parâmetro de tipo Integer é substituído pela classe Object em tempo de compilação. No entanto, autoboxing e unboxing nos permitiram realizar a adição de inteiros em tempo de compilação. Em tempo de execução, o código foi executado como uma execução de código normal, sem qualquer sobrecarga adicional.