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:
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:
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% Anstatt Comparable
zu verwenden, wäre es einfacher, ein Comparator
zu verwenden:
Sie könnten auch alle Komparatoren miteinander verketten, indem Sie thenComparing
und haben
Dann können Sie das verwenden, indem Sie Comparator
objects mit comparing(keyExtractor)
oder die primitive Spezialisierung comparingInt
.
Mit diesem Ansatz können Sie sogar die Existenz eines solchen Hilfsprogramms in Frage stellen und einfach
haben %Vor%Tags und Links java generics variadic-functions wildcard comparable