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?
 

Noctarius

Top Contributor
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.)
 
G

Gast2

Gast
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.
 

hermann_1900

Neues Mitglied
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.
 

jgh

Top Contributor
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
 

Landei

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J HashSet mit Comparable sortieren Java Basics - Anfänger-Themen 13
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
L Interface & Comparable Java Basics - Anfänger-Themen 15
I Generics und Comparable Java Basics - Anfänger-Themen 14
O Comparable Generic Java Basics - Anfänger-Themen 24
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
C Was macht `public class ClassName<T extends Comparable<T>>`? Java Basics - Anfänger-Themen 14
N Comparable bzw Comparator Java Basics - Anfänger-Themen 5
M Generische Liste aus Comparable-Objekten Java Basics - Anfänger-Themen 6
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
K Comparable - Objekte aus Array vergleichen und größtes auswählen Java Basics - Anfänger-Themen 1
Shizmo Frage zu Comparable Java Basics - Anfänger-Themen 4
L LinkedList Comparable < > MEHRFACH implementieren? Java Basics - Anfänger-Themen 3
N Datentypen LocalDate Generic Comparable Java Basics - Anfänger-Themen 2
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
N Compiler-Fehler Comparable / compareTo implementierung Java Basics - Anfänger-Themen 2
F Comparable mit String Java Basics - Anfänger-Themen 5
M Comparable und Comparator nicht ganz klar Java Basics - Anfänger-Themen 1
F Objekte sortieren mit Comparable Java Basics - Anfänger-Themen 9
R Mehrere Interfaces(Comparable, ...) Java Basics - Anfänger-Themen 2
B Comparable & Comparator Java Basics - Anfänger-Themen 9
C Comparable Interface Java Basics - Anfänger-Themen 8
T Interface Interface Comparable Problem... Java Basics - Anfänger-Themen 2
B Object "Method" in TreeSet, Fehler beim Vergleichen/Comparable Java Basics - Anfänger-Themen 9
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
J Probleme mit Comparable, compareTo() Java Basics - Anfänger-Themen 2
A Comparable interface Java Basics - Anfänger-Themen 26
I Interface Comparable für Server-Item-Interface Java Basics - Anfänger-Themen 12
P Comparable und Generics Java Basics - Anfänger-Themen 6
S comparable und equals Java Basics - Anfänger-Themen 7
S Unterschied Comparable und Comparator Java Basics - Anfänger-Themen 2
M Frage zum Interface Comparable Java Basics - Anfänger-Themen 3
S Comparable Java Basics - Anfänger-Themen 4
H Comparable und Comparator Java Basics - Anfänger-Themen 22
S instanceof Comparable...geht nicht? Java Basics - Anfänger-Themen 20
M comparable funktion & reverse funktion Java Basics - Anfänger-Themen 8
H Mehrere Comparable Java Basics - Anfänger-Themen 4
S Comparator / Comparable ? Java Basics - Anfänger-Themen 3
D Comparable - Bucketsort / Radixsort? Java Basics - Anfänger-Themen 2
B Mehrere Werte mit Comparable sortieren Java Basics - Anfänger-Themen 14
S String umwandeln in Comparable Java Basics - Anfänger-Themen 6
R Comparable Interface Funktionalität selbst programmieren? Java Basics - Anfänger-Themen 3
A Interface Comparable Java Basics - Anfänger-Themen 2
J Comparable Java Basics - Anfänger-Themen 9
D Frage zu Collection.sort bzw. Comparator u. Comparable Java Basics - Anfänger-Themen 2
B Wann Comparator und wann Comparable Java Basics - Anfänger-Themen 6
frau-u Wie vergleicht Comparable Java Basics - Anfänger-Themen 2
M Comparable - Bedingung erzwingen Java Basics - Anfänger-Themen 3
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
A Verständnisfrage Java Basics - Anfänger-Themen 12
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
P Verständnisfrage: PageFactory.initElements Java Basics - Anfänger-Themen 2
R do while Schleife Verständnisfrage Java Basics - Anfänger-Themen 2
G while.next() Verständnisfrage Java Basics - Anfänger-Themen 16
Vivien Kurze Verständnisfrage zu Java Point aus java.awt.* Java Basics - Anfänger-Themen 5
C Erste Schritte Anfänger Verständnisfrage zum Compiler Java Basics - Anfänger-Themen 31
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
Der Grütz Verständnisfrage zu Übung aus Java Kurs - Schaltjahr bestimmen Java Basics - Anfänger-Themen 2
J Verständnisfrage zu throws neben Funktionen Java Basics - Anfänger-Themen 2
TimoN11 Verständnisfrage bei Aufgabe Java Basics - Anfänger-Themen 2
P Verständnisfrage zum Mapping Java Basics - Anfänger-Themen 3
M Java Version Verständnisfrage Java Basics - Anfänger-Themen 16
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
T Verständnisfrage zur Konsolenausgabe Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
D Verständnisfrage zur Modellierung einer HDD Java Basics - Anfänger-Themen 17
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
S Verständnisfrage lokale Ordnerpfade Java Basics - Anfänger-Themen 1
T Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 7
J Java Starthilfe Verständnisfrage Aufgabe Java Basics - Anfänger-Themen 2
O Anfänger, Verständnisfrage Java Basics - Anfänger-Themen 3
C Verständnisfrage zu Modulo Java Basics - Anfänger-Themen 6
C Verständnisfrage bezüglich der Do-While Schleife Java Basics - Anfänger-Themen 9
L Verständnisfrage - Speicherabbild Java Basics - Anfänger-Themen 4
melly_ Verständnisfrage zu args Java Basics - Anfänger-Themen 3
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
K Verständnisfrage eines Abschnitts Java Basics - Anfänger-Themen 6
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
S Modell View Controller Verständnisfrage Java Basics - Anfänger-Themen 24
J Superklassen Konstruktor Verständnisfrage Java Basics - Anfänger-Themen 1
JavaTalksToMe Erste Schritte Println-Frage (Verständnisfrage) Java Basics - Anfänger-Themen 1
R Verständnisfrage zu Objekten u. Übergabeparameter Java Basics - Anfänger-Themen 8
G Collections Verständnisfrage zur For-Each-Schleife Java Basics - Anfänger-Themen 7
b1ck Interface Verständnisfrage zum GUI mit "swing" Java Basics - Anfänger-Themen 1
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
G Verständnisfrage zu for-each Java Basics - Anfänger-Themen 4
DontFeedTheTroll Erste Schritte Verständnisfrage zu If-Anweisung Java Basics - Anfänger-Themen 7
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
Z Verständnisfrage Anfängerprogramm Java Basics - Anfänger-Themen 0
T Verständnisfrage Zuweisungs-/arithmet. Operatoren Java Basics - Anfänger-Themen 2
G Methoden Verständnisfrage zur Methoden Java Basics - Anfänger-Themen 7
LionAge Kapselung, Verständnisfrage zur Objekterzeugung Java Basics - Anfänger-Themen 4
Z Verständnisfrage zum Multithreading Java Basics - Anfänger-Themen 3
R OOP / Verständnisfrage zum Konstuktor (siehe code) Java Basics - Anfänger-Themen 7
gamebreiti Verständnisfrage zu contains() Java Basics - Anfänger-Themen 10
A Verständnisfrage - Koordinatenumrechnung Java Basics - Anfänger-Themen 9
J Erste Schritte Verständnisfrage im Bezug auf das (richtige) Programmieren Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben