Vorlesung Informatik 2 - Teil A: Java Kurs

4.4 Generische Typen

Im Zusammenhang mit der LinkedList haben wir schon generische Typen genutzt:

LinkedList<JButton> liste = new LinkedList<JButton>();

Der Compiler achtet jetzt darauf, dass nur JButton Objekte in die Liste kommen:

liste.add(new JButton("1");
liste.add(new JButton("2");

Und wir können die vereinfachte for-Schleife anwenden:

for(JButton b:liste) b.addActionListener(this);

d.h. wir brauchen keine Typumwandlung durch einen Cast zu programmieren.

Jetzt schauen wir unter die Motorhaube, schreiben also eine Klasse mit generischem Typ. Wir wollen Schachteln programmieren, in denen man beliebige Objekte speichern kann. Ohne generische Typen sähe das so aus:

class Schachtel{
    Object  inhalt;
    public Schachtel(Object x){
         inhalt = x;
   }
   public Object getInhalt(){
         return inhalt;
   }
}

Bei der Verwendung der Schachteln müssen wir Casten:

     Schachtel s = new Schachtel(new Buch());
     Buch b = (Buch) s.getInhalt();

Um den Cast zu vermeiden, verwenden wir einen generischen Typ:
   

class Schachtel<T>{
    T  inhalt;
    public Schachtel(T x){
         inhalt = x;
   }
   public T getInhalt(){
         return inhalt;
   }
}

Jetzt brauchen wir keinen Cast mehr:

      Schachtel s = new Schachtel(new Buch());
      Buch b = s.getInhalt();

Die Verwendung von generischen Typen macht Programme lesbarer und sicherer.

Will man, dass ein generischer Typ ein Interface implementiert oder eine Klasse erweitert schreibt man:

class Beispiel <T extends ActionListener>{ ...

Wichtig: auch bei Interfaces wird hier extends verwendet, nicht implements.

Manchmal braucht man mehrere generische Typen in einer Klasse:

class Beispiel <T extends ActionListener, K extends SpielFigur>{ ...

Lehrvideo  (YouTube)