homedukeOOP mit Java: Generische Klassen in Java ab Version 1.5 Prof. Dr. Uwe Schmidt FH Wedel

Generische Klassen in Java ab Version 1.5

weiter

weiter

Generische ADTs mit Java 1.5

analog zu C++
mit Typüberprüfung zur Übersetzungszeit

public
abstract
class Stack<E> {
 
  //--------------------
  // der Konstruktor
 
  public
  Stack() { }
 
  //--------------------
  // die Attribut-Funktionen
 
  public
  abstract
  boolean isEmpty();
 
  public
  abstract
  E top();
 
  //--------------------
  // die modifizierenden Funktionen
 
  public
  abstract
  Stack<E> push(E e);
 
  public
  abstract
  Stack<E> pop();
 
  //--------------------
  // die Vorbedingungen
 
  public
  boolean preTop() {
    return
      ! isEmpty();
  }
 
  public
  boolean prePop() {
    return
      ! isEmpty();
  }
}
 
 
weiter

Eine konkrete Implementierung nach der gleichen Art wie oben

class SimpleStack<E>
    extends Stack<E> {
 
  // die Datenfelder: nicht nach aussen sichtbar
 
  private
  E [] a;                     // <-----
 
  private
  int i;
 
  //--------------------
  // der Konstruktor
 
  public
  SimpleStack() {
 
    // a = new E[20];            // so leider nicht
 
    @SuppressWarnings("unchecked")
    E [] t = (E []) new Object[20];   // aber so: mit downcast
 
    a = t;
    i = 0;
  }
 
  //--------------------
  // die Attribut-Funktionen
 
  public
  boolean isEmpty() {
    return
      i == 0;
  }
 
  public
  E top() {                   // <-----
    return
      a[i-1];
  }
 
  //--------------------
  // die modifizierenden Funktionen
 
  public
  Stack<E> push(E e) {        // <-----
    a[i++] = e;
    return
      this;
  }
 
  public
  Stack<E> pop() {
    a[--i] = null;
    return
      this;
  }
 
  // Vorbedingungen sind schon implementiert
}
 
weiter

Eine Anwendung

class SimpleTest {
 
    // zwei Stacks mit unterschiedlichen Elementtypen
 
    Stack<Integer> intStack;
 
    Stack<String> stringStack;
 
    void test() {
        intStack
            .push(new Integer(1))
            .push(new Integer(2))
            .push(new Integer(3));
 
        // autoboxing:
        // die int-Zahlen werden automatisch
        // in Integer-Objekte eingewickelt
 
        intStack.push(1).push(2).push(3);
 
        stringStack.push("abc").push("xyz");
    }
}
weiter
merke
Syntax sehr ähnlich wie bei C++
merke
Für Java 1.5 ist die JVM nicht geändert worden: Abwärtskompatibilität
merke
Typparameter werden in Java vollständig zur Übersetzungszeit ausgewertet und sind im JVM Code nicht mehr vorhanden
merke
In der JVM wird mit sogenannten raw types gearbeitet.
Mit raw types bezeichnet man generische Größen, bei denen die Typparmater gelöscht worden sind.
Diese raw types stehen für Familien von Typen.
merke
Typparameter können nicht zur Laufzeitbeschleunigung durch Vermeidung von downcasts genutzt werden.
merke
Primitiven Typen sind nicht als Typparameter zugelassen.
merke
Namenskonvention: Kurze Namen (häufig ein Großbuchstabe) als Bezeichner für Typparameter

Letzte Änderung: 14.02.2012
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel