# Parameter einer Klasse auf Interface prüfen



## Tissi (16. Jun 2008)

Hallo,
ich habe folgendes Probelm:
Ich habe eine Klasse List<K, V> von Map<K, V> abgeleitet, wobei K der Typ für die Schlüssel sein soll.
Um die Liste nach Schlüsseln sortieren zu können, muss ich sie ja irgendwie vergleichen können, also muss K entweder Comparable implementieren oder ich brauche einen Comparator<K>.
Ich möchte nun beide Möglichkeiten zur Verfügung stellen, das heißt, es soll möglich sein, Comparables als Schlüssel zu nehmen oder, falls die Schlüssel nicht Comparable sind, der List einen Comparator zu übergeben.
Dazu soll nun der Konstruktor der Liste schon prüfen, ob K Comparable implementiert hat.

Kann man das irgendwie hinkriegen? Ich hab gestern schon ziemlich lange mit java.lang.reflect experimentiert, es aber nicht hinbekommen.

Gruß
Tissi


----------



## SlaterB (16. Jun 2008)

K selber kannst du nicht prüfen, aber du kannst dir Class<K> oder ein K-Objekt übergeben lassen und dann 
Object instanceof Class
oder       
Class.isAssignableFrom(Class)
verwenden,
wobei sowas generell nicht schön ist, 
Collections.sort macht das auch nicht, was spricht gegen eine normale Exception später beim Sortieren?


----------



## FArt (16. Jun 2008)

Ist dieses Verhalten denn sinnvoll? Nicht unbedingt.

Warum müssen die Schlüssel denn sortierbar sein? Und wenn sie es sind, vielleicht können sie sinnvoll nach verschiednen Kriterien sortiert werden.

Das Interface Comparable und die Möglichkeit einen Comparator einzusetzen haben verschiedene Ansprüche und sollten generell nicht vermischt werden.


----------



## Tissi (16. Jun 2008)

1. Die Schlüssel müssen sortierbar sein, damit die Liste nachher sortiert ist und in logarithmischem Aufwand gesucht werden kann (ist in der Aufgabe verlangt).

2. Das man Comparable und Comparator nicht vermischen sollte ist zwar richtig, ich wollte sie aber eigentlich nicht mischen, sondern beim Instanziieren der Liste die Wahl zwischen den beiden lassen, damit man, wenn die Schlüssel nach ihrer natürlichen Ordnung sortiert werden sollen, nicht extra einen Comparator braucht, der Comparables anhand ihrer compareTo().Methode vergleicht.

Insofern finde ich das Verhalten meiner Liste schon sinnvoll, da man es aber nur schwer und unschön implementieren kann und es nicht zwingend nötig ist, werde ich wohl schlichtweg darauf verzichten.

Danke für die schnelle Antwort!


----------



## Marco13 (16. Jun 2008)

Was spricht gegen einen "DefaultComparator" der beliebige Comparables vergleicht? D.h. man verwendet IMMER einen Comparator. Wenn keiner angegeben wurde, verwendet man den DefaultComparator, der die Schlüssel auf Comparable castet....


----------



## Kim Stebel (16. Jun 2008)

Du solltest die Klasse folgendermaßen definieren, dann brauchst du gar keine checks zur Laufzeit und du hast die "type safety" die dir vorschwebt:

public class List<k extends Comparable,v> implements Map<Comparable,v>


----------



## Tissi (17. Jun 2008)

@Kim: Dann wäre ich aber bei den Keys auf Comparables eingeschränkt.

@Marco: Genauso hab ich es jetzt auch gemacht.


----------

