Generische Methode zum Sortieren einer Map nach Werten

8

Ich habe ein kleines Programm, das eine Karte basierend auf ihren Werten sortieren soll. Hier ist, was ich bisher habe:

%Vor%

Ich möchte, dass mein generischer Wert V mit allem vergleichbar ist, was entweder V oder mindestens eine Unterklasse von V ist.

Ich bekomme den folgenden Fehler für das Codestück:

%Vor%
  

Gebundene Diskrepanz: Die Methode compareTo (?   erweitert V) vom Typ V ist nicht anwendbar   für die Argumente (V). Der Platzhalter   Parameter? erweitert V hat keine niedrigere   gebunden und kann tatsächlich mehr sein   einschränkend als Argument V

Wie kann es restriktiver sein?

Wenn ich die Deklaration zu

ändere %Vor%

dann gibt es keinen Fehler. Aber das ist nicht was ich will.

Eine Problemumgehung, die ich habe, ist, dass ich die Deklaration ändern kann zu:

%Vor%

, aber dabei verliere ich die Flexibilität, dass ich keine Map weitergeben kann, deren Wert Comparable mit einer Subklasse von sich selbst implementiert.

Entschuldigung für eine so lange Frage. Vielen Dank im Voraus.

    
Swaranga Sarma 09.06.2011, 09:02
quelle

3 Antworten

4

Ich denke Ihre zweite Option, nämlich

%Vor%

ist der Weg zu. Ich denke das ist so, weil wenn du schreibst

%Vor%

Sie sagen grundsätzlich, dass Sie jede Instanz von V mit jeder Instanz von C vergleichen können. Aber was hier fehlt, ist, dass Sie, weil Sie Collections.sort(..) intern aufrufen wollen, auch jede Instanz von C mit jeder Instanz von V vergleichen können. Aber die Generika drücken dies nicht aus, und der Compiler beklagt sich zu Recht.

Grundsätzlich, um einige Werte zu sortieren (zumindest mit Collections.sort(..) ) müssen sie gegenseitig vergleichbar sein, aber die generischen Einschränkungen, die Sie sich vorstellen, garantieren nur, dass Sie in eine Richtung vergleichen können.

    
Waldheinz 09.06.2011 09:30
quelle
3
  

implementiert Vergleichbar mit einer Unterklasse von sich selbst.

Dies ist "schlechtes Design": Als eine gute allgemeine Regel sollten Klassen nichts über ihre Unterklassen wissen.

Welchen Anwendungsfall haben Sie im Sinn?

Ich denke public static <K, V extends Comparable<V>> ist in Ordnung.

    
Bohemian 09.06.2011 09:40
quelle
0

Ich glaube, Sie wollten, dass V eine Erweiterung eines Typs T ist. Versuchen Sie, einen temporären Typ T wie folgt in der Template-Deklaration hinzuzufügen:

%Vor%

alles andere bleibt gleich. Wenn du das nicht meintest, dann sind all deine Vergleichbaren ein Untertyp von V, dann ist public static <K, V extends Comparable<V>> sinnvoll, weil die Kindklasse von V, die compareTo überschreibt, aus Vs Sicht die compareTo-Methode mit der gleichen Signatur wie die compareTo-Methode, die V hat. Dh, die compareTo-Methode, die V deklariert, wird aufgerufen (es kann jedoch die überschriebene Definition in der Kindklasse von V sein). Und so ist V extends Comparable<V> ausreichend und korrekt. Ich hoffe, ich habe mich klar gemacht.

    
Raze 09.06.2011 14:21
quelle

Tags und Links