Sobes.tech
Middle

Was sind Generics und wofür werden sie verwendet?

sobes.tech KI

Antwort von AI

Generics in Java ermöglichen die Erstellung von Klassen, Schnittstellen und Methoden, die mit parametrisierten Typen arbeiten.

Hauptzweck von Generics:

  • Erhöhung der Typsicherheit: Der Compiler überprüft die Typen zur Compile-Zeit und verhindert ClassCastException zur Laufzeit.
  • Vermeidung von Typumwandlungen: Es ist nicht notwendig, Typen manuell umzuwandeln, wenn Elemente aus Sammlungen extrahiert werden.
  • Erstellung von flexiblerem und wiederverwendbarem Code: Man kann generische Algorithmen und Datenstrukturen schreiben, die auf verschiedene Datentypen anwendbar sind.

Beispiel ohne Generics:

// Vor Java 5
import java.util.ArrayList;
import java.util.List;

public class OldStyleList {
    public static void main(String[] args) {
        List list = new ArrayList(); // ohne Typisierung
        list.add("Hallo");
        list.add(123); // beliebiges Objekt kann hinzugefügt werden

        String s = (String) list.get(0); // Typumwandlung erforderlich
        Integer i = (Integer) list.get(1); // Typumwandlung erforderlich

        // Es kann zu einem Laufzeitfehler kommen
        // String error = (String) list.get(1); // ClassCastException
        System.out.println(s);
        System.out.println(i);
    }
}

Beispiel mit Generics:

// Mit Generics
import java.util.ArrayList;
import java.util.List;

public class GenericList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(); // Liste von Strings
        list.add("Hallo");
        // list.add(123); // Kompilierungsfehler - kann keinen Integer hinzufügen

        String s = list.get(0); // keine Typumwandlung notwendig

        // Es ist nicht möglich, einen anderen Typ hinzuzufügen, was Fehler verhindert
        // List<Integer> intList = new ArrayList<>();
        // intList.add("Welt"); // Kompilierungsfehler
        System.out.println(s);
    }
}

Generics werden auch in:

  • Klassen: ArrayList<E>, HashMap<K, V>
  • Schnittstellen: List<E>, Map<K, V>
  • Methoden: <T> void printArray(T[] array)
  • Typbeschränkungen: <T extends Comparable<T>> (Beschränkung auf Typen, die Comparable implementieren)

Die Implementierung von Generics in Java basiert auf "Type Erasure" (Typ-Entfernung) zur Compile-Zeit. Das bedeutet, dass die Informationen über die generischen Typen entfernt werden und die JVM zur Laufzeit mit rohen Typen arbeitet. Dies gewährleistet Kompatibilität mit älteren Java-Versionen, hat aber einige Einschränkungen.