Generics und Comparable

Individuum

Mitglied
Hey ich habe eine kurze Frage.

Wie kann ich Werte die generisch festgelget sind vergleichen.
Habe im Internet schon gelesen, dass das Comparable Interface in der compareTo Methode bei gleich 0 zurückgibt etc.
Die muss man aber ja erst schreiben, es ist ja ein Interface.


Code:
public class BTreeNode <T extends Number implements Comparable<BTreeNode> {

    public T value;

    public BTreeNode left;

    public BTreeNode right;

    /**
     * @param value
     */
    public BTreeNode(T value) {
        super();
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    @Override
    public int compareTo(BTreeNode test) {
        if (test.value == value) {
            return 0;
        }
    }
}

}

Wenn ich jetzt in meiner Compare to Methode sagen will:
if (test.value < value) {
return -1;
}
funktioniert das wegen generics nicht.

Habt ihr eine Idee?

Liebe Grüße
 

httpdigest

Top Contributor
Kannst du bitte erst einmal die Generics deiner Klassendefinition korrekt angeben?
Java:
public class BTreeNode <T extends Number implements Comparable<BTreeNode> { ... }
ist sicherlich nicht korrekt so.

Falls du einfach nur ein ">" nach "<T extends Number" vergessen hast und somit dein T ein Number ist, delegiere in deiner eigenen compareTo() einfach nach `value.compareTo(test.value)`, da dein T ja eben ein Number und somit auch ein Comparable<Number> ist.
EDIT: Obiges ist falsch! Number implementiert nicht Comparable!
 
Zuletzt bearbeitet:

Individuum

Mitglied
Hat sich erledigt, ich habe es jetzt so geschrieben.

Code:
public class BTree <T extends Comparable <T>>  {

    private BTreeNode root;

    public void insert(T value){
        if(root==null){
            this.root = new BTreeNode(value);
            return;
        }
        insert(root,value);
    }


    private void insert(BTreeNode node, T value) {
        if (node.value.compareTo(value) > 0) {
            // links
            if (node.left == null) {
                // hier einfuegen
                node.left = new BTreeNode<>(value);
                return;
            } else {
                // an Kindknoten delegieren
                insert(node.left, value);
            }

        } else if (node.value.compareTo(value) < 0) {
            // rechts
            if (node.right == null) {
                node.right = new BTreeNode<>(value);
                return;
            } else {
                insert(node.right, value);
            }
        } else {
            return;
        }
    }
}

was ich aber nicht verstehe: Wieso kann wenn ich Compareable als Interface implementiere und meine Klasse Numbers extends nicht vergleichen?
 

httpdigest

Top Contributor
Wieso kann wenn ich Compareable als Interface implementiere und meine Klasse Numbers extends nicht vergleichen?
Was? Kannst du bitte Satzzeichen/Interpunktion verwenden, damit dieser Satz verständlich wird?

Was genau meinst du mit "vergleichen"? Wenn du ein `T extends Number` hast, dann habe ich dir bereits gezeigt, wie du das vergleichen kannst.
 

httpdigest

Top Contributor
Ach sooo... entschuldige bitte, ich habe gedacht, Number wäre Comparable, aber das ist es ja gar nicht. Nur die konkreten Number-Subklassen sind Comparable. Number selbst kannst du nur dadurch vergleichen, dass du es in einen konkreten Primitivtyp wandelst, z.B. mit Number.toDouble().
 

httpdigest

Top Contributor
Eine Möglichkeit wären Intersection Types in Java:
Java:
public class MeineKlasseMitNumber<T extends Number & Comparable<T>> implements Comparable<MeineKlasseMitNumber<T>> {
  T value;
  public int compareTo(MeineKlasseMitNumber<T> o) {
    return value.compareTo(o.value);
  }
}
Hier kann man nun alle Unterklassen von Number für T substituieren, da alle bisher existierenden Number-Subklassen (Integer, BigInteger, BigDecimal, Long, Double, ...) auch Comparable<SieSelbst> sind.
 

Individuum

Mitglied
Ah interessant, werde es damit auch probieren.

Code:
public class BTreeNode  <T> implements Comparable <BTreeNode>/* <T extends Comparable <T>> */ /*extends Number> implements Comparable<BTreeNode> */ {
    /*extends Number> implements Comparable<BTreeNode> */

    public Integer value;

    ////(node.value.compareTo(value) < 0)

    public BTreeNode left;
    public BTreeNode right;

    /**
     * @param value
     */
    public BTreeNode(Integer value) {
        super();
        this.value = value;
    }

    public Integer getValue() {
        return value;
    }

    @Override
    public int compareTo(BTreeNode t) {
        if (this.value > t.value) {
            return 1;
        }
        if (this.value < t.value) {
            return -1;
        }
        if (this.value == t.value) {
            return 0;
        }
        return 0;
    }
}

Was hälst du von diesem Code? Ist wenn ich es so schreibe irgendein unterschied zu meinem ersten, außer dass ich meiner Klasse für Value Integer geben muss?
 

httpdigest

Top Contributor
Ich verstehe nicht, was die Nutzung von Integer mit einem Baum zu tun haben soll...
Mach das doch einfach so, wie ich gezeigt habe:
Java:
public class BTreeNode<T extends Number & Comparable<T>> implements Comparable<BTreeNode<T>> {
  private T value;
  private BTreeNode<T> left, right;
  ...
  public int compareTo(BTreeNode<T> o) {
    return value.compareTo(o.value);
  }
}
 

httpdigest

Top Contributor
Und wenn man nur die totale Ordnung auf den Baumelementen definiert durch den in ihnen gespeicherten Werten haben möchte, braucht man genauer gesagt noch nicht einmal Number. Da reicht doch einfach nur <T extends Comparable<T>>.
Für den Baumknoten ist es völlig irrelevant, welchen konkreten Typ der im Baumknoten gespeicherte Wert hat. Einzig allein die Sortierung ist wichtig. Es könnte genausogut auch ein String oder eine java.net.URI sein.
 

httpdigest

Top Contributor
Dass du das Comparable Interface implementieren musst, hat doch damit überhaupt nichts zu tun. Natürlich kannst du das Comparable Interface implementieren (und das habe ich ja auch gemacht). Das streitet ja niemand ab und hat auch nichts damit zu tun, keinen konkreten Typ für den value zu verwenden, sondern einfach nur eine Typvariable T.
 

mihe7

Top Contributor
Sicher reicht es, jedoch müssen wir das Comparable Interface implementieren.
Wenn Du Comparable implementieren musst, dann bezieht sich das wohl auf BTreeNode (übrigens ein besch... Name für einen binären Baum, ein B-Tree ist anders).

Es geht also darum, dass zwei BTreeNode-Instanzen miteinander verglichen werden können, d. h. Deine Klassendefinition die Form (Skizze)
Java:
public class  BTreeNode implements Comparable<BTreeNode>
hat.

Wenn Du für den Wert den Datentyp int verwendest, könntest Du schreiben:
Java:
    private int value;

    public int compareTo(BTreeNode node) {
        return value - node.value;
    }

Nun willst Du Dich aber für den Wert nicht auf einen bestimmten Typ festlegen, denn je nach Zweck können ganz unterschiedliche Datentypen in Frage kommen. Daher spendierst Du Deiner Klasse einen Typparameter T und erhältst erst einmal
Java:
public class  BTreeNode<T> implements Comparable<BTreeNode<T>>
Problem dabei ist, dass Du den Typ nicht kennst, d. h. für den Wert kannst Du (bzw. der Compiler) nur annehmen, dass es sich um irgendein Object handelt. Somit könnte für den Wert auch ein Typ verwendet werden, auf dem keine Ordnung definiert ist. Die einzige Möglichkeit, die Du dann hast, ist auf Gleichheit zu prüfen, was für den Baum nicht ausreichend ist.

Code:
Java:
    private T value;
    public int compareTo(BTreeNode<T> node) {
        // wie sollen value und node.value miteinander verglichen werden?!?
    }

D. h. Du willst einen Typ T haben, der einen Vergleich zwischen zwei Objekten vom Typ T zulässt. Das funktioniert wieder über das Comparable-Interface:
Java:
public class  BTreeNode<T implements Comparable<T>> implements Comparable<BTreeNode<T>>
Jetzt kennst Du zwar den genauen Typ von T immer noch nicht aber Du (bzw. der Compiler) weißt, dass es sich um einen Typ handelt, der Comparable<T> implementiert, so dass Du jetzt schreiben kannst:
Java:
    private T value;
    public int compareTo(BTreeNode<T> node) {
        return value.compareTo(node.value);
    }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
P Comparable und Generics Java Basics - Anfänger-Themen 6
H Generics machen mich verrückt Java Basics - Anfänger-Themen 8
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
MarvinsDepression Datentypen Generics: Erste Berührungen Java Basics - Anfänger-Themen 6
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
Cassy3 Generics - CompareTo Java Basics - Anfänger-Themen 21
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
districon Generics implementieren Java Basics - Anfänger-Themen 2
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
G Generics Compilerfehler Java Basics - Anfänger-Themen 6
G Generics Methoden Java Basics - Anfänger-Themen 7
G Generics Java Basics - Anfänger-Themen 3
L Generics Tripel Java Basics - Anfänger-Themen 26
W Fragen zu Generics Java Basics - Anfänger-Themen 14
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
X Wie Generics richtig benutzen ? Java Basics - Anfänger-Themen 5
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
I Java Generics factory method Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
G Generics mit ? und Diamantoperator Java Basics - Anfänger-Themen 4
G Generics: Wildcard ? Java Basics - Anfänger-Themen 12
D Generics methode Java Basics - Anfänger-Themen 2
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
W Generics - Typ zurückbekommen Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Generics von Profis leicht erklärt Java Basics - Anfänger-Themen 7
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
J Collections Generics: Typ wird nicht erkannt Java Basics - Anfänger-Themen 7
D Generics ArrayList: Bug im Quellcode Java Basics - Anfänger-Themen 14
C Generics Java Basics - Anfänger-Themen 8
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
T Generics in Java... Java Basics - Anfänger-Themen 9
J Generics Java Basics - Anfänger-Themen 3
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
O Generics - Implementierung Java Basics - Anfänger-Themen 7
Shizmo Frage zu Generics Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
H Typsicherheit/Generics Java Basics - Anfänger-Themen 1
U Java generics funktioniert nicht Java Basics - Anfänger-Themen 0
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
A Generics Java Basics - Anfänger-Themen 4
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
R Compiler-Fehler Generics Problem Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
K Generics bei Klassen- und Interfacedeklarationen Java Basics - Anfänger-Themen 3
D toArray und Generics Java Basics - Anfänger-Themen 2
D Zwei Generics beim Überladen von Methoden Java Basics - Anfänger-Themen 3
C Erste Schritte Filter für Generics oder ähnliches Java Basics - Anfänger-Themen 2
M Frage zu Generics-Deklaration Java Basics - Anfänger-Themen 5
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
J Java Generics - Frage zu Types Java Basics - Anfänger-Themen 2
M <T> Generics Java Basics - Anfänger-Themen 7
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
T Polymorphie Generics-Problem Java Basics - Anfänger-Themen 2
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
J Array Generics Java Basics - Anfänger-Themen 3
J Generics casten Java Basics - Anfänger-Themen 14
J Generics wildcard Java Basics - Anfänger-Themen 6
E Listen und Generics Java Basics - Anfänger-Themen 9
X Generics Java Basics - Anfänger-Themen 6
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
M OOP Mit Generics auf Methoden zugreifen? Java Basics - Anfänger-Themen 10
S Generics Java Basics - Anfänger-Themen 4
G Generics kein Zugriff auf getter eines Objekts Java Basics - Anfänger-Themen 4
L Datentypen Problem mit Generics und null Java Basics - Anfänger-Themen 6
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
W Interface Problem mit Generics Java Basics - Anfänger-Themen 2
M OOP Generics und Wildcards Java Basics - Anfänger-Themen 3
D Generics - Warnmeldungen Java Basics - Anfänger-Themen 2
M Polymorphie generics einsteigerprobleme Java Basics - Anfänger-Themen 3
D Vererbung Generics und Vererbung Java Basics - Anfänger-Themen 8
C Generics Array Java Basics - Anfänger-Themen 43
D Fehler mit generics Java Basics - Anfänger-Themen 10
S Generics - CaseInsensitiveMap selber schreiben? Java Basics - Anfänger-Themen 5
K Datentypen Generics Java Basics - Anfänger-Themen 3
I Generics (Subtypen) Java Basics - Anfänger-Themen 17
N Typeinschränkung bei Generics Java Basics - Anfänger-Themen 13
C Generics und Cast Java Basics - Anfänger-Themen 5
H Generics werden in -source 1.2 nicht unterstützt Java Basics - Anfänger-Themen 16
M Datentypen Generics: Exacten Typ ermitteln Java Basics - Anfänger-Themen 6
N Generics und Interfaces Java Basics - Anfänger-Themen 5
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
lumo Java Generics Java Basics - Anfänger-Themen 19
M verlinkte Liste mit generics Java Basics - Anfänger-Themen 7
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
S Generics und Typerkennung Java Basics - Anfänger-Themen 7
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
B Java Listen und Generics Java Basics - Anfänger-Themen 35
O Abstract Method & Generics Java Basics - Anfänger-Themen 10
K Aufgabe Generics Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben