Software Enginering

Typ-Parameter

Der Typ eines Objektes entscheidet darüber, welche Operationen oder Methoden auf das Objekt anwendbar sind. So lassen sich beispiels­weise Objekte vom Typ Integer miteinander multi­plizieren, Objekte vom Typ String miteinander verketten usw.

Deswegen ist es bei der Pro­grammierung wichtig, den Typ eines Objektes zu kennen. Nur so weiß man, welche Operationen auf das Objekt anwendbar sind.

Datenstrukturen mit Typ-Parametern

Viele Daten­strukturen sind allerdings vom Typ der beteiligten Objekte weitgehend unabhängig. So lassen sich in einer Liste gleicher­maßen Integer-Zahlen speichern wie auch Strings oder irgendwelche anderen Objekte. Theoretisch kann eine solche Liste sogar Objekte vom Typ Integer oder String oder eines beliebigen anderen Typs in bunter Mischung enthalten. In der Praxis ist ein solcher Fall allerdings selten, denn es wäre unklar, welche Operationen sich auf die Objekte der Liste anwenden lassen. Die Liste ließe sich noch nicht einmal sortieren, denn hierzu ist es erforderlich, dass auf alle Objekte der Liste die Operation "Vergleich" anwendbar ist. Man kann aber nicht Äpfel mit Birnen vergleichen.

In der Praxis kommen daher haupt­sächlich Listen vor, deren Einträge alle vom gleichen Typ sind. Daher ist es sinnvoll, gleich bei der Deklaration der Liste anzugeben, von welchem Typ die Einträge sein sollen.

Bei der Deklaration eines Arrays ist es erforderlich, den Datentyp der Array-Einträge anzugeben. Mit folgender Deklaration wird etwa ein Array a mit 7 String-Einträgen deklariert und angelegt:

String[] a=new String[7];

Bei der Deklaration einer ArrayList wird der Typ der Elemente in Form eines Typ-Parameters angegeben; eine ArrayList mit Einträgen vom Typ String wird etwa folgender­maßen deklariert und angelegt:

ArrayList<String> a=new ArrayList<String>();

Sortierprogramme mit Typ-Parametern

Die Sortier­programme sind der Einfachheit halber für Folgen von Integer-Zahlen geschrieben. Was aber, wenn eine Folge von Strings sortiert werden soll? Was, wenn eine Folge von Graphen hinsichtlich der Knotenanzahl der Graphen sortiert werden soll? Die Programme müssten entsprechend angepasst werden, an den entsprechenden Stellen müsste int durch String oder durch Graph ersetzt werden. Und die Vergleichs­operation müsste, sofern sie nicht wie bei String standard­mäßig definiert ist, entsprechend angepasst werden. Für jeden Datentyp müsste ein eigenes Sortier­programm geschrieben werden.

Als Lösung bietet Java die Möglichkeit, den Typ der zu sortierenden Daten als Parameter anzugeben. Dann wird nur ein einziges Sortier­programm benötigt, z.B. InsertionSorter<Type>, mit dem formalen Typ-Parameter Type. Soll nun eine Folge von Double-Zahlen sortiert werden, erzeugen wir einen InsertionSorter mit aktuellem Typ-Parameter Double:

InsertionSorter<Double> s=new InsertionSorter<Double>();

Sollen Strings sortiert werden, geben wir String als aktuellen Typ-Parameter an. Und sollen Graphen hinsichtlich ihrer Knotenanzahl sortiert werden, so geben wir Graph als aktuellen Typ-Parameter an.

Soweit die Idee – die Schwierig­keit besteht nun darin, den Vergleichs­operator  > , der im Insertionsort-Programm vorkommt, für den zunächst noch unbekannten aktuellen Datentyp entsprechend anzupassen. Dies funktioniert nur, wenn der formale Typ-Parameter Type das Interface Comparable implementiert. Nur dann ist sicher­gestellt, dass sich zwei Objekte vom Typ Type miteinander vergleichen lassen. Denn das Interface Comparable verlangt, dass eine Methode compareTo vorhanden ist. Und damit die Methode compareTo weiß, von welchem Typ die zu ver­gleichenden Elemente sind, benötigt das Interface Comparable seinerseits einen Typ-Parameter; in diesem Fall ist dies auch Type, denn in einem InsertionSorter sollen ja Objekte vom Typ Type miteinander verglichen werden.

Das Ergebnis ist folgende Klasse:

public class InsertionSorter<Type  extends Comparable<Type>>
{
    private Type[] a;
    private int n;

    public void sort(Type[] a)
    {
        this.a=a;
        n=a.length;
        insertionsort();
    }

    private void insertionsort()
    {
        int i, j;
        Type t;
        for (i=1; i<n; i++)
        {
            j=i;
            t=a[j];
            while (j>0 && a[j-1].compareTo(t)>0)
            {
                a[j]=a[j-1];
                j--;
            }
            a[j]=t;
        }
    }

}    // end class InsertionSorter

 

Ein Aufruf der Methode compareTo in einem Ausdruck x.CompareTo(y) ergibt

x.CompareTo(y)  =   geschweifte Klammer
1    falls x > y
0    falls x = y
-1    falls x < y

 

 

Weiter:   [up]

 


H.W. Lang   mail@hwlang.de   Impressum   Datenschutz
Created: 27.02.2012   Updated: 18.02.2023
Diese Webseiten sind während meiner Lehrtätigkeit an der Hochschule Flensburg entstanden