# Generische Klassen ### Definition Eine generische Klasse in Java ist eine Klasse, die mit **Typparametern** arbeitet, anstatt mit festen Datentypen. Sie ermöglicht es, denselben Code für verschiedene Datentypen zu verwenden, ohne dabei die Typsicherheit zu verlieren. > Eine generische Klasse ist eine Klasse, die einen oder mehrere Platzhalter (``) für Datentypen verwendet, damit sie mit unterschiedlichen Typen arbeiten kann, ohne dass Typumwandlungen nötig sind. --- ### Beispiel ```java public class Box { private T inhalt; public void setInhalt(T inhalt) { this.inhalt = inhalt; } public T getInhalt() { return inhalt; } } ``` → `T` ist ein Typparameter, der beim Erzeugen des Objekts durch einen konkreten Typ ersetzt wird: ```java Box textBox = new Box<>(); Box zahlenBox = new Box<>(); ``` --- ### Kurz erklärt * `` steht für einen beliebigen Datentyp. * Der Compiler sorgt dafür, dass nur dieser Typ verwendet werden darf. * Dadurch entsteht typsicherer, wiederverwendbarer und flexibler Code. ### extends Class Es ist nicht selten der Fall, dass die Typparameter einer generischen Klasse zwingend einer bestimmten Superklasse angehören müssen, um ungeeignete Datentypen zu vermeiden. So ist es sinnvoll, beispielsweise die Variablen eines Rechners nur mit numerischen Typen zu initialisieren. Dies kann durch Erweiterungsangaben der Typparameter erfolgen: ```java class NumberBox { private T value; public NumberBox(T value) { this.value = value; } public T getValue() { return value; } public double getDoubleValue() { return value.doubleValue(); // Number-Methode } public static void main(String[] args) { NumberBox intBox = new NumberBox<>(42); System.out.println(intBox.getDoubleValue()); // 42.0 NumberBox doubleBox = new NumberBox<>(3.14); System.out.println(doubleBox.getDoubleValue()); // 3.14 // Das würde einen Compiler-Fehler geben: // NumberBox stringBox = new NumberBox<>("Hallo"); } } ``` | Klasse/Interface | Typische Subklassen/Implementierungen | Beispiel für generische Einschränkung | |--------------------------|-----------------------------------------------|-----------------------------------------------| | `Number` | `Integer`, `Double`, `Float`, `Long`, `Short` | `` | | `Comparable` | `String`, `Integer`, `Double`, `LocalDate` | `>` | | `CharSequence` | `String`, `StringBuilder`, `StringBuffer` | `` | | `Collection` | `List`, `Set`, `Queue` | `>` | | `List` | `ArrayList`, `LinkedList` | `>` | | `Map` | `HashMap`, `TreeMap` | `>` | | `AutoCloseable` | `InputStream`, `OutputStream`, `Scanner` | `` | | `Runnable` | (funktionales Interface) | `` | | `Iterable` | `Collection`, `List`, `Set` | `>` | | `Object` | **Jede Klasse** (oberste Klasse in Java) | `` (selten nötig) | | `Enum` | Alle Aufzählungstypen (z.B. `Day`, `Color`) | `>` |