Interface Comparable Verständnisfrage

hermann_1900

Neues Mitglied
Hallo Zusammen,

ich mache hier gerade ein Beispiel aus einem (sehr guten) Buch durch. Dazu habe ich eine grundlegende Versändnisfrage.

Ich poste einfach 'mal den Code:

Java:
public class Ring implements Comparable <Ring> {

    private double durchmesser;

    public Ring (double durchmesser) {
        this.durchmesser = durchmesser;
    }

    public String toString () {
        return "Ring der Groeße: " + durchmesser;
    }

    public int compareTo (Ring o) {
        double durchmesser2 = o.durchmesser;
        if (durchmesser < durchmesser2)
            return -1;
        if (durchmesser > durchmesser2)
            return 1;
        else
            return 0;
    }
}//Class Ring

public class RingTest {
    public static void main (String[] args) {
        Ring[] ringe = new Ring[10];

        for (int i = 0; i < ringe.length; i++)
            ringe[i] = new Ring (Math.random());

        java.util.Arrays.sort(ringe);

        for (Ring r : ringe)
            System.out.println (r);
    }//main
}//Class RingTest

Der Code funktioniert so prima. Meine Verständnisfrage ist: Warum muss das Interface Comparable überhaupt in Ring implementiert werden?

Wenn ich in die API gucke, steht da: static void java.util.Arrays.sort(Object[] a),

d.H. ein Array vom Typ Object wird übergeben. Jetzt könnte ja die sort-Methode doch rein theoretisch auch, ohne dass Ring Comparable implementiert hat, auf die Methode compareTo() meiner Objekte vom Typ Ring zugreifen? Versteht Ihr was ich meine? Kann man das irgendwie erklären? An welcher Stelle und zu welchem Zweck/Vorteil setzt Arrays.sort(Object[] a) vorraus, dass Ring Comparable implementiert hat?
 
Java ist eine statisch typisierte Sprache und damit braucht man einen gemeinsamen Typen der diese Methode definiert.

Es gibt andere Sprachen da braucht man ein Interface nicht explizit implementieren und kann trotzdem auf das Interface casten, wenn zur Laufzeit alle Methoden des Interfaces existieren (Groovy kann das glaube ich z.B.)
 
Nein, du musst Comparable implementieren, weil...
Java:
if (((Comparable) a[runHi++]).compareTo(a[lo]) < 0) { // Descending
... hier sonst ne ClassCastException fliegen würde 😉

Hier würde Ring zu nem Comparable gecastet und da knallts dann. Dieser Cast ist auch notwendig, da sonst die Methode compareTo nicht aufgerufen werden könnte, Object kennt die Methode ja nicht.
 
Nein, du musst Comparable implementieren, weil...
Java:
if (((Comparable) a[runHi++]).compareTo(a[lo]) < 0) { // Descending
... hier sonst ne ClassCastException fliegen würde 😉

Hier würde Ring zu nem Comparable gecastet und da knallts dann. Dieser Cast ist auch notwendig, da sonst die Methode compareTo nicht aufgerufen werden könnte, Object kennt die Methode ja nicht.

Und warum muss unbedingt gecastet werden? Wieso "kennt" Object die Methode nicht? So ganz verstanden habe ich das glaube ich nicht.
 
evtl. verstehe ich dich auch nur falsch...aber mal meine 5ct:
die Methode
Code:
public static void sort(Object[] a)
aus der Klasse
Code:
Arrays
, erwartet zwar nur ein Object-Array, aber alle diese Objecte müssen das Comparable-Interface implementiert haben.

Arrays (Java Platform SE 6)[]%29
 
Die Situation ist hier aus "historischen" Gründen etwas verwirrend: Arrays und Generics "können" nicht gut miteinander, insbesondere lassen sich Generics nicht typsicher in ein Array packen, und genau deshalb ist in der [c]Arrays.sort[/c]-Methode dieser unschöne Cast versteckt, der auch mächtig nach hinten losgehen kann. In
Code:
java.utils.Collections
hat man es richtig gemacht, dort gibt es...

[c]static <T extends Comparable<? super T>> void sort(List<T> list)[/c]

Wenn du das ? einmal ignorierst (*), siehst du, dass an den Typ [c]T[/c] hier die "Anforderung" gestellt wird, auch [c]Comparable<T>[/c] zu implementieren, also kann dieses [c]sort[/c] nicht mit "unvergleichbaren" Typen aufgerufen werden, und es wird keine [c]ClassCastException[/c] auftreten. In
Code:
Arrays
konnte man es aus den oben genannten Gründen leider nicht "richtig" machen.


(*) Es handelt sich beim ? um ein "Wildcard", das dazu dient, Varianzen auszudrücken. Mit anderen Worten ist hier nicht nur T, sondern auch ein Supertyp von T erlaubt.
 

Zurück
Oben