Middle
Czym są Generics i do czego służą?
sobes.tech AI
Odpowiedź od AI
Generics w Java pozwalają na tworzenie klas, interfejsów i metod, które działają z parametryzowanymi typami.
Głównym celem generics:
- Zwiększenie bezpieczeństwa typów: Kompilator sprawdza typy na etapie kompilacji, zapobiegając
ClassCastExceptionpodczas działania. - Usunięcie konieczności rzutowania typów: Nie trzeba ręcznie rzutować typów podczas pobierania elementów z kolekcji.
- Tworzenie bardziej elastycznego i wielokrotnego użytku kodu: Można pisać ogólne algorytmy i struktury danych, które można stosować do różnych typów danych.
Przykład bez generics:
// Przed Java 5
import java.util.ArrayList;
import java.util.List;
public class OldStyleList {
public static void main(String[] args) {
List list = new ArrayList(); // bez typowania
list.add("cześć");
list.add(123); // można dodać dowolny obiekt
String s = (String) list.get(0); // konieczne rzutowanie
Integer i = (Integer) list.get(1); // konieczne rzutowanie
// Możliwy błąd rzutowania
// String error = (String) list.get(1); // ClassCastException
System.out.println(s);
System.out.println(i);
}
}
Przykład z generics:
// Z użyciem generics
import java.util.ArrayList;
import java.util.List;
public class GenericList {
public static void main(String[] args) {
List<String> list = new ArrayList<>(); // lista stringów
list.add("cześć");
// list.add(123); // błąd kompilacji - nie można dodać Integer
String s = list.get(0); // brak konieczności rzutowania
// Nie można dodać innego typu, co zapobiega błędom
// List<Integer> intList = new ArrayList<>();
// intList.add("świat"); // błąd kompilacji
System.out.println(s);
}
}
Generics są również używane w:
- Klasach:
ArrayList<E>,HashMap<K, V> - Interfejsach:
List<E>,Map<K, V> - Metodach:
<T> void printArray(T[] array) - Ograniczeniach typów:
<T extends Comparable<T>>(ograniczenie do typów implementującychComparable)
Implementacja generics w Java opiera się na "wymazywaniu typów" (type erasure) w fazie kompilacji. Oznacza to, że informacje o typach generycznych są usuwane, a w czasie działania JVM operuje na surowych typach. Zapewnia to kompatybilność z wcześniejszymi wersjami Java, ale ma pewne ograniczenia.