PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java - generische Typen vergleichen


neogeo
2010-12-18, 12:12:41
Hallo!

Ich habe in Java eine generische Node Klasse, mit der man die Knoten eines Baumes darstellen kann. Generisch deswegen, weil der Schlüssel der Node von beliebigen Typen sein darf, auch wenn außer Integer und String nicht viel Sinn macht.

Jetzt bin ich an einem Punkt angelangt, an dem ich von außerhalb 2 Nodes anhand ihrer Schlüssel vergleichen will (zwecks binärem Suchbaum). also nicht nur auf Gleichheit, sondern auch größer und kleiner.

Dass die 2 generischen Schlüssel vom selben Typ sind ist eigentlich durch den Programmfluss sichergestellt, aber wie kann ich diese 2 generischen, mir also unbekannten Typen, auf größer, kleiner, gleich testen?

Habe schon versucht, die Fälle Integer und String hardcoded zu machen, d.h. mit instanceof den generischen Typ pürfen und dann casten, aber das ist irgendwie hässlich, oder?


private int compareKeys( KEY a, KEY b ) {
if(a instanceof Integer && b instanceof Integer) {
return ((Integer)a).compareTo((Integer)b);
}
// andere Typen, gleiches Verfahren
}


Wie würdet ihr das machen? Danke

patermatrix
2010-12-18, 12:32:28
Da du ja sowieso nur Instanzen vom gleichen Typ miteinander vergleichen kannst, wieso nicht einfach
a.compareTo(b)
denn genau dafür ist die compareTo Methode ja da. Dazu kannst du ja voraussetzen, dass deine verwendeten Typen das Interface Comparable implementieren müssen. Was für die Standarddatentypen in Java (String, Integer etc.) gegeben ist.

Oder versteh ich jetzt gerade etwas falsch?

RattuS
2010-12-18, 12:39:00
Ich nehme an, dass du um eine individuelle Implementierung einer beliebigen Vergleichbarkeit nicht herumkommen wirst, wenn wirklich alle generischen Typen untereinander vergleichbar sein sollen.

Monger
2010-12-18, 12:48:34
Was du brauchst, sind generic constraints, oder wie man sie in Java nennt: bound wildcards (http://download.oracle.com/javase/tutorial/extra/generics/wildcards.html).

Du kannst logischerweise nicht Äpfel mit Birnen vergleichen. Objekte die zueinander vergleichbar sind, müssen mindestens mal irgendein Verwandschaftsverhältnis zueinander haben. Auf jeden Fall müssen sie mindestens mal IComparable implementieren.

Dein Baum ist dann eben auch keine Ansammlung von irgendwelchen Objekten, sondern einer ganz bestimmten Sorte von Baumknoten. Wenn du das mit den Wildcards entsprechend definierst, kannst du dann auf der Oberklasse auch CompareTo o.ä. aufrufen, und somit den einen mit dem anderen Knoten vergleichen.

Könntest du mal bitte die Deklaration deiner Klasse posten, inklusive da wo du den Generic Parameter definierst?

neogeo
2010-12-18, 18:50:59
Vielen Dank für eure Antworten, werde etwas herumexperimentieren. Hier die Node Klasse, aufs nötigste reduziert:


public class Node<KEY,VALUE> {

public KEY key;
public VALUE value;
public Node<KEY,VALUE> left;
public Node<KEY,VALUE> right;
public Node<KEY,VALUE> parent;


Node( KEY key, VALUE value, Node<KEY,VALUE> parent ) {
this.key = key;
this.value = value;
this.left = null;
this.right = null;
this.parent = parent;
}

}