Interface Generics: prüfen ob Interface deklariert wird

Bernd Hohmann

Top Contributor
Java:
public class ObjectCache<V> {
   public int add(V value)  { ...}

   public void sort() {
       if ( V implements Compareable ) 
          quicksortCompareable();
          return;
       if ( V implements Comparator )
          quicksortComparator
          return;
       // jetzt machen wir dicke backen....
 
   }
}

Sprich: ich muss feststelle, ob mein Generics "V" nun Comperable oder Comparator implementiert.

Wie mach ich das am klügsten und vorallem mit möglicht wenig Kosten?

Bernd
 

Landei

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

Bernd Hohmann

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

Bernd
 

Landei

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

Bernd Hohmann

Top Contributor
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:
	public void sort() throws IOException {
		checkopen();
		if (size() == 0) return;

		V value = get(0);
		if (value instanceof Comparator) {
			qsort_comparator(0, size() - 1);
			return;
		}
		if (value instanceof Comparable<?>) {
			qsort_comparable(0, size() - 1); // Todo: qsort_comparable() fertig implementieren
			return;
		}
		throw new InvalidObjectException("Cannot sort: <V> does not implement Comparable or Comparator");
	}

Soweit bin ich schonmal ohne dass der Compiler meckert.

Bernd
 
Zuletzt bearbeitet:
B

bygones

Gast
Die Aussage Noctarius widerspricht nicht Landeis.

Noctarius sagte dass du nur die variablen testen kannst, nicht den Generischen parameter.

Landei sagt, dass dir der Vergleich ob die variable ein comparator ist nix bringt, weil sie nix sagt, was sie sortiert...

Java:
if (value instanceof Comparator) {
            qsort_comparator(0, size() - 1);
            return;
        }
nun weisst du das value ein Comparator ist, aber nicht was er sortiert. Er kann Strings sortieren, Integers oder was auch immer...
 

Landei

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

Marco13

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

Bernd Hohmann

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

Mein Java-Decompiler sagt dazu:

Java:
public void sort() throws IOException {
    checkopen();
    if (size() == 0) return;

    Object localObject = get(0);
    if ((localObject instanceof Comparator)) {
      qsort_comparator(0, size() - 1);
      return;
    }
    if ((localObject instanceof Comparable)) {
      qsort_comparable(0, size() - 1);
      return;
    }
    throw new InvalidObjectException("Cannot sort: <V> does not implement Comparable or Comparator");
}

Bis jetzt sehe ich nicht, dass mir der Typ verloren gegangen ist - oder irre ich?

Bernd
 
N

nillehammer

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

Bernd Hohmann

Top Contributor
Ok, verstanden - nein, im Cache liegt immer nur eine Sorte von Compareable/Comparator.

Ich wüsste jetzt auch nicht, wie eine Sortierung laufen sollte wenn da alles Mögliche gemischt drin liegt.

Bernd
 
N

nillehammer

Gast
Ich wüsste jetzt auch nicht, wie eine Sortierung laufen sollte wenn da alles Mögliche gemischt drin liegt.
Ich auch nicht und Java auch nicht. Deswegen ist Comparable ja generisch und schmeißt ClassCastExceptions, wenn alles Mögliche gemischt ist ;)
 
J

JohannisderKaeufer

Gast
Java:
class Auto implements Comparable<Fahrzeug> {

int ps;

public int compareTo(Fahrzeug o){
    return (ps - o.ps < 0)? -1:1;
}

public int compareTo(Bus b){
  return -1;
}

public int compareTo(Motorrad m){
  return 1;
}
}

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

nillehammer

Gast
@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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
I Generics und Comparable Java Basics - Anfänger-Themen 14
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
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
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
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
P Comparable und Generics Java Basics - Anfänger-Themen 6
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