Generics

Geschrieben von Michael Biesmann & Fabian Markert

1. Einleitung
2. Was sind Generics?
3. Welche Einschränkungen existieren für Generics?
4. Wie sehen Generic-Deklarationen aus?
5. Wofür verwendet man Generics?
5.1. Beispiel 1
5.2. Beispiel 2
6. Wie funktionieren Generics?
7. Welche Typen von Generics gibt es?
8. Wie kann man Datentypen mit Generics verwenden?
9. Welche Neuerungen gibt es?

1. Einleitung

Dies ist unser zweiter vorbereitender Artikel von drei, bevor wir uns unserem Hauptthema widmen. Wir wollen uns in diesem Post über Generics den folgenden Fragestellungen stellen:

  • Was sind Generics
  • Welche Einschränkungen existieren für Generics
  • Wie sehen Generic-Deklarationen aus
  • Wofür verwendet man Generics
  • Wie funktionieren Generics
  • Welche Typen von Generics gibt es
  • Wie kann man Datentypen mit Generics verwenden
  • Welche Neuerungen gibt es

Teil 1 Teil 3

2. Was sind Generics?

Generics sind Typen, die man parametrisieren kann. Häufig spricht man auch von Typ-Parametern und Typ-Variablen. Unter Typen versteht man in diesem Zusammenhang Datentypen. Analog kann man von Datentyp-Parametern und Datentyp-Variablen sprechen. Mit dem JSR 14 wurden Generics formalisiert und haben mit der Java Version 1.5 im Jahr 2005 in die Java-Welt Einzug gehalten.


3. Welche Einschränkungen existieren für Generics?

  • Generics kann man Invariant, Kovariant und Kontravariant verwenden
  • Man kann Klassen und Methoden generisch machen
  • Generics können nur auf Objekte angewendet werden, nicht aber auf primitive Datentypen. Hierfür muss man dann die Wrapper-Klassen der primitiven Datentypen verwenden
  • In der Spezifikation heißt es: „All parameterized types share the same class or interface at runtime.“. D.h. das nur eine Kopie der Klasse zur Laufzeit existiert und somit static-Variablen geteilt werden. Hierbei ist es egal, welcher Datentyp eingesetzt wird.


4. Wie sehen Generic-Deklarationen aus?


5. Wofür verwendet man Generics?

Durch das Aufkommen von Generics wurde Java um eine mächtige Funktionalität erweitert. Hierdurch wird das Schreiben von Templates gefördert, wodurch bei der Entwicklung von Quellcode eine Zeitersparnis resultiert. Starke Anwendung finden Generics im Bereich der Klassen, die das java.util.Collection Interface implementieren. Hier tragen Generics dazu bei, den Quellcode dahingehend sicherer zu machen, dass Casting-Fehler eliminiert werden. Dies geschieht durch die Angabe des Datentyps, denn dadurch verlagern sich die Fehler von der Laufzeit in die Compilezeit. Siehe hierzu Bitte Beispiel 1. Ein weiterer positiver Aspekt, der sich durch die Verwendung von Generics ergibt, ist der, dass früher, vor der Zeit von Generics, Typecasts von Listenelementen zu Objekten explizit aufgeführt werden mussten. Siehe hierfür Beispiel 2.

5.1. Beispiel 1

5.2. Beispiel 2


6. Wie funktionieren Generics?

Zur Laufzeit wird eine Klasse erzeugt, die dann durch die gewünschte Typ-Variable substituiert wird.


7. Welche Typen von Generics gibt es?

Generics an Klassen:

Das <T> entspricht der Deklaration eines generischen Datentyps.

Generics an Methoden:

Das <T> ist der definierte generische Datentyp. Das T danach ist der Rückgabetyp der Methode und die T's in der Parameterliste, sind die Übergabeparameter.


8. Wie kann man Datentypen mit Generics verwenden?

Hier ein Beispiel für den Einsatz von Generics.


9. Welche Neuerungen gibt es?

Seit Java 1.7 existiert der Diamond-Operator, wodurch der Typ nur auf einer Seite der Deklaration angegeben werden muss.


Stand: 5. November 2013