Kategorie szkoleń | Egzaminy | Kontakt

Odpowiedź (1)

  • 0

Typy generyczne wprowadzono w Javie w celu ściślejszej kontroli typów już na etapie kompilacji (np. możemy określić typy elementów przechowywanych w kolekcji).

Aby uprościć implementację (oraz kod bajrowy) na etapie kompilacji informacja o typach generycznych jest wymazywana. Ten proces nosi nazwę type erasure. Typy generyczne są zastępowane przez swoje ograniczenia, zaś typy nieograniczone - przez typ Object. Uzyskany kod bajtowy zawiera definicje "standardowych" (niegenerycznych, tzw. raw types) typów klas, interfejsów, metod. Aby zapewnić bezpieczeństwo typów, tam gdzie jest to niezbędne, podczas konwersji typów dodawane są rzutowania.

Przyjrzyjmy się przykładowi:

import java.util.LinkedList;
import java.util.List;

public class ErasureTest {
  public static String getElement(Integer inputElement) {
    List<String> genColl = new LinkedList<String>();
    List rawColl = genColl;    // ostrzeżenie o użyciu typu niegenerycznego
    rawColl.add(inputElement); // ostrzeżenie dot. bezpieczeństwa typów
    return genColl.get(0);
  }

  public static void main(String[] args) {
    System.out.println(getElement(1));
  }

}

Program zakończy się wyrzuceniem wyjątku java.lang.ClassCastException na skutek próby zrzutowania typu Integer na typ String (w wierszu zawierającym instrukcję return).

To zachowanie da się wyjaśnić, gdy przeanalizujemy jak wygląda powyższy kod po usunięciu informacji o typach generycznych:

import java.util.LinkedList;
import java.util.List;

public class ErasureTest {
  public static String getElement(Integer inputElement) {
    List genColl = new LinkedList();
    List rawColl = genColl;
    rawColl.add(inputElement);
    return (String) genColl.get(0);
  }

  public static void main(String[] args) {
    System.out.println(getElement(1));
  }

}

 

 

 

 

 

  • Odpowiedział
  • @ | 29.11.2015
  • TRENER MODERATOR ALTKOM AKADEMII