Kombinieren von Varargs und Generics für verkettete Vergleiche in Java

8

Hier ist eine harte Nuss zu knacken. Ich habe einen Konflikt zwischen der Verwendung von Vararg und Generika zusammen. Nach dem angegebenen Code:

%Vor%

Ich möchte, dass die Methode compareTo mehr als eine Vergleichsbedingung verwendet. Wenn die Strings identisch sind, verwenden Sie stattdessen die Ints. Übliche Situation würde ich sagen.
Ich würde gerne eine statische Methode erstellen, um dies im Allgemeinen zu handhaben. Und ich möchte, dass die neue Methode chainedCompare wie folgt aufgerufen wird:

%Vor%

Die Lambdas sind Varargs der Java-8-Interface-Funktion. Also habe ich zuerst die Methode so geschrieben:

%Vor%

Aber ich dachte nicht, dass in diesem Fall der generische Typ C für alle Function<T, C> Vergleiche im varargs Array der gleiche Typ sein muss. Wie Sie oben sehen können, möchte ich verschiedene Vergleichbare verwenden (wie String und Integer im Beispiel).
Dann habe ich es auf diese Version geändert:

%Vor%

Typ C wird hier durch Platzhalter ersetzt. Während der Methodenaufruf jetzt funktioniert, kompiliert die Methode selbst nicht, da der Platzhalter typisierte Parameter von compareTo .

Also brauche ich einerseits einen festen generischen Typ (extends Comparable) für die Function-Schnittstelle, andererseits brauche ich Function-Interfaces verschiedener (zweiter) generischer Typen, wo man normalerweise einen Platzhalter setzen könnte. Wie man das auflöst?
Meine einzige Voraussetzung ist, dass ich die statische Methode so einfach aufrufen kann, wie es mit einer undefinierten Anzahl von Vergleichsbedingungen angezeigt wird.

Basierend auf den Vorschlägen von Tunaki konnte ich die Methode wie folgt modifizieren, die wie gewünscht verwendet werden kann:

%Vor%     
Arceus 10.03.2016, 12:44
quelle

1 Antwort

4

Anstatt Comparable zu verwenden, wäre es einfacher, ein Comparator zu verwenden:

%Vor%

Sie könnten auch alle Komparatoren miteinander verketten, indem Sie thenComparing und haben

%Vor%

Dann können Sie das verwenden, indem Sie Comparator objects mit comparing(keyExtractor) oder die primitive Spezialisierung comparingInt .

%Vor%

Mit diesem Ansatz können Sie sogar die Existenz eines solchen Hilfsprogramms in Frage stellen und einfach

haben %Vor%     
Tunaki 10.03.2016, 12:56
quelle