Sobes.tech
Middle+

Czym jest usuwanie typów w Java?

sobes.tech AI

Odpowiedź od AI

Usuwanie typów (type erasure) to proces w Javie, w którym informacje o typach są usuwane na etapie kompilacji, a skompilowany kod bajtowy nie zawiera informacji o parametrach generycznych.

Kluczowe punkty:

  • Zgodność: Pozwala generykom działać z starszym kodem, który nie używa generyków.
  • Implementacja: Kompilator zastępuje parametryzowane typy ich górną granicą (zwykle Object) i wstawia niezbędne rzutowania typów.
  • Ograniczenia:
    • Nie można używać typów prymitywnych jako parametrów generycznych (np. List<int>).
    • Nie można tworzyć tablic typu parametryzowanego (np. new List<String>[10]).
    • Nie można używać operatora instanceof do sprawdzania typu parametryzowanego (np. if (list instanceof List<String>)).
    • Nie można przeciążać metod według typów parametryzowanych, jeśli ich podpisy po usunięciu są takie same.

Przykład:

// Kod źródłowy z generykami
List<String> stringList = new ArrayList<>();
stringList.add("hello");
String s = stringList.get(0); // Nie wymaga jawnego rzutowania

// Bytecode po usunięciu typów
List list = new ArrayList(); // Typ List<String> zastąpiono List
list.add("hello");
String s = (String)list.get(0); // Wstawione niejawne rzutowanie

Pomimo ograniczeń, usuwanie typów jest kluczowym aspektem implementacji generyków w Javie, zapewniając kompatybilność wsteczną.