Der Typ eines Objektes entscheidet darüber, welche Operationen oder Methoden auf das Objekt anwendbar sind. So lassen sich beispielsweise Objekte vom Typ Integer miteinander multiplizieren, Objekte vom Typ String miteinander verketten usw.
Deswegen ist es bei der Programmierung wichtig, den Typ eines Objektes zu kennen. Nur so weiß man, welche Operationen auf das Objekt anwendbar sind.
Viele Datenstrukturen sind allerdings vom Typ der beteiligten Objekte weitgehend unabhängig. So lassen sich in einer Liste gleichermaß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 hauptsä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 folgendermaßen deklariert und angelegt:
ArrayList<String> a=new ArrayList<String>();
Die Sortierprogramme 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 Vergleichsoperation müsste, sofern sie nicht wie bei String standardmäßig definiert ist, entsprechend angepasst werden. Für jeden Datentyp müsste ein eigenes Sortierprogramm geschrieben werden.
Als Lösung bietet Java die Möglichkeit, den Typ der zu sortierenden Daten als Parameter anzugeben. Dann wird nur ein einziges Sortierprogramm 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 Schwierigkeit besteht nun darin, den Vergleichsoperator > , 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 sichergestellt, 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 vergleichenden 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:
Ein Aufruf der Methode compareTo in einem Ausdruck x.CompareTo(y) ergibt
x.CompareTo(y) = |
|
Weiter: [up]