Ich glaube, das nützt dir hier nichts. Wenn V Comparable ist, kannst du V-Instanzen vergleichen. Wenn V ein Comparator<U> ist, kannst du damit U-Instanzen vergleichen, nicht V-Instanzen.
Schau dir mal TreeMap an: Da muss man den Comparator (so man nicht Comparable verwenden will) im Konstrukur übergeben, und der hat den Typ Comparator<V>, und nicht V.
Ich glaube, das nützt dir hier nichts. Wenn V Comparable ist, kannst du V-Instanzen vergleichen. Wenn V ein Comparator<U> ist, kannst du damit U-Instanzen vergleichen, nicht V-Instanzen.
Das ist ja genau das, was ich erreichen will: Wenn das zu speichernde Objekt im ObjectCache "Comparable" implementiert, dann wird auch mit einer Methode sortiert die "Comparable" nutzt. Das geht ganz Prima solange viele kleine Objekte abgespeichert werden.
Dumm wird es, wenn die Objekte grösser werden (also so 10-50MB per Stück). Hier muss bei "Comparable" jedesmal das Objekt komplett von der Platte gelesen und deserialisiert werden um dessen "compareTo(...)" aufzurufen.
Daher mache ich es mir recht einfach: die ".add(value)" Methode wird nochmal mit einem ".add(value, key)" geschrieben und als "key" muss der zukünftige Vergleichswert übergeben werden.
Implementiert "value" dann Comparator sortiere ich nur "key" statt des serialisierten "value".
Im derzeitigen Szenario denke ich mal, dass die Sortierung von 300 Objekten (ca. 20GB Daten) übers Netz statt 18min nur noch <1 Sekunden dauert *fg*
Nochmal ganz langsam: Wenn V ein Comparator ist, kannst du damit keine Vs vergleichen. Und was das für ein Comparator genau ist, bekommst du zur Laufzeit nicht mehr raus (type erasure).
Nochmal ganz langsam: Wenn V ein Comparator ist, kannst du damit keine Vs vergleichen. Und was das für ein Comparator genau ist, bekommst du zur Laufzeit nicht mehr raus (type erasure).
Ja eben doch gemäss vom Rezept von Nocatrius: "Du kannst nur die Instanz also value auf eine Implementierung testen."
Ich ziehe mir eine (beliebig passende) deserialisierte Instanz von "V" und gut ist - es sei denn, Du sprichst ein Problem an was mich übermorgen (also wenn ich es fertig machen will) derbe treffen wird.
Java:
publicvoidsort()throwsIOException{checkopen();if(size()==0)return;V value =get(0);if(value instanceofComparator){qsort_comparator(0,size()-1);return;}if(value instanceofComparable<?>){qsort_comparable(0,size()-1);// Todo: qsort_comparable() fertig implementierenreturn;}thrownewInvalidObjectException("Cannot sort: <V> does not implement Comparable or Comparator");}
Soweit bin ich schonmal ohne dass der Compiler meckert.
Du wirst dann gegen eine Mauer laufen, die da "Type Erasure" heißt. Das ist eine ganz prinzipielle Einschränkung, um die sich nur in sehr speziellen Fällen herumhacken lässt. Deshalb ja mein Rat, dich jetzt - auf konzeptioneller Ebene - damit zu beschäftigen.
Mal was ganz gewagtes: Könnte sort nicht abstract sein, und es zwei verschiedene Implementierungen davon geben? Oder der Comparator im Konstruktor der Klasse gesetzt/festgelegt werden? (Ggf. mit einem default 'ComparableComparator', der beliebige Comparables vergleicht... schräg, dass es das nicht in der Standard-API gibt...)
Du wirst dann gegen eine Mauer laufen, die da "Type Erasure" heißt. Das ist eine ganz prinzipielle Einschränkung, um die sich nur in sehr speziellen Fällen herumhacken lässt. Deshalb ja mein Rat, dich jetzt - auf konzeptioneller Ebene - damit zu beschäftigen.
publicvoidsort()throwsIOException{checkopen();if(size()==0)return;Object localObject =get(0);if((localObject instanceofComparator)){qsort_comparator(0,size()-1);return;}if((localObject instanceofComparable)){qsort_comparable(0,size()-1);return;}thrownewInvalidObjectException("Cannot sort: <V> does not implement Comparable or Comparator");}
Bis jetzt sehe ich nicht, dass mir der Typ verloren gegangen ist - oder irre ich?
Ja, Dir geht der generische Anteil der Interface-Definition flöten. Wenn du in Deinem Object-Cache verischiedene Implementierungen von Comparable (z.B. ein paar Strings und ein paar Integers) zusammen drinnen hast und diese dann mit deinem Alghoritmus per qsort_comparable sortieren willst, dann versucht Dein Programm, Strings mit Integers zu comparen und das dürfte mit einer ClassCast-Exception quittiert werden. Wenn du natürlich sicher stellen kannst, dass nur Objekte, die mutually Comparable sind, in Deinem Cache liegen, dann ist das für Dich kein Problem.
Sowas sollte sich doch zumindest compilieren lassen und in einer Collection<Fahrzeug> verwenden lassen. Damit würden dann Motorräder ganz vorne und Busse ganz hinten in der Liste auftauchen.
@JohannisderKaeufer: Schon klar, über sowas waren wir in der Diskussion aber schon hinaus. Mit "alles mögliche gemischt" war wirklich alles Mögliche gemeint und explizit Objekte, die eben nicht wechselseitig Comparable sind.