Java Reference
In-Depth Information
1 .2 Erste Beispiele
Somit können wir nun eine erste eigene Klasse mit Generics schreiben, welche lediglich ein
Container für ein Objekt eines parametrisierten Typs T ist und entsprechende Getter- und
Setter-Methoden bereitstellt (siehe Listing 1.1).
Listing 1.1 Einfaches Beispiel einer Generics-Klasse
package javacomp.basics;
public class GenericClass<T>
{
private T content;
public T getContent()
{
return content;
}
public void setContent(T content)
{
this.content = content;
}
}
Die Klasse kann nun so verwendet werden, dass man ein Objekt erzeugt, in dem nur Strings,
und ein anderes Objekt, in dem nur Integers abgelegt werden können:
GenericClass<String> stringContainer = new GenericClass<String>();
stringContainer.setContent("hallo");
String s = stringContainer.getContent();
System.out.println(s);
GenericClass<Integer> intContainer = new GenericClass<Integer>();
intContainer.setContent(3); //Auto-Boxing
int i = intContainer.getContent(); //Auto-Unboxing
System.out.println(i);
In einem zweiten Beispiel wollen wir mit Generics eine Klasse entwickeln, die nicht nur ein
einziges Objekt eines parametrisierten Typs T, sondern beliebig viele Objekte des Typs T in
einem Feld (Array) speichern kann. Es soll ein Keller (Stack) realisiert werden, der die
Methoden push zum Hinzufügen und pop zum Entfernen eines Elements besitzt. Ein Keller
funktioniert bekanntlich nach dem LIFO-Prinzip (Last In First Out), was bedeutet, dass
immer das zuletzt hinzugefügte Element als erstes wieder entfernt wird. Wir starten mit
einer generischen Klasse mit Typparameter T, die ein Attribut des Typs T[] zum Speichern
der Objekte hat (außerdem ein Attribut vom Typ int, das den Index angibt, an dem das
nächste Element im Feld gespeichert wird; dieser Wert ist immer auch die Anzahl der ak-
tuell vorhandenen Elemente). Der erste Ansatz, das Attribut vom Typ T[] im Konstruktor
durch new T[length] zu initialisieren, scheitert, da eine solche Anweisung nicht möglich
ist und zu einem Syntaxfehler führt („Cannot create a generic array of T“ — eine Begrün-
dung dafür folgt später). Wir verwenden stattdessen new Object[length] und casten auf
T[]. Das Feld wird in Listing 1.2 mit einer initialen Größe erzeugt, die als Konstruktorpara-
 
Search WWH ::




Custom Search