Java 8 Comparator Type Inference Confusion
Java 8 führte Verbesserungen bei der Comparator-Nutzung durch Lambda-Ausdrücke ein. Wenn jedoch mehrere thenComparing-Aufrufe verkettet werden, kann die Typinferenz unklar werden. Dieses Problem ergibt sich aus der Tatsache, dass Lambda-Ausdrücken keine Typinferenz als Methodenempfängerausdrücke haben.
Komparatorverkettung und Typinferenz
Bedenken Sie den folgenden Code:
Comparator<String> c1 = Comparator.comparing(String::length); Comparator<String> c2 = c1.thenComparing(String::compareToIgnoreCase);
Die erste Zeile verwendet eine Methodenreferenz ohne Typparameter, die eine Typinferenz basierend auf dem Rückgabetyp von String::length auslöst. Dieser Typ wird verwendet, um den Typ von p1 in der thenComparing-Methode abzuleiten.
In einer Situation wie dieser jedoch:
Collections.sort(list, c1.thenComparing(String::compareToIgnoreCase)); // Error: cannot resolve method
Die Typinferenz schlägt fehl, weil der Collections.sort-Methode ein bestimmter Typ fehlt Informationen für c1. Um dieses Problem zu lösen, können wir explizite Typparameter bereitstellen:
Collections.sort(list, c1.thenComparing(Comparator.comparing(String::compareToIgnoreCase)));
Listen- vs. Sammlungssortierung
In List.sort wird die Typinferenz anders durchgeführt. Bedenken Sie:
list.sort(Comparator.comparing(String::length).thenComparing(String::compareToIgnoreCase)); // No error
Hier ist keine Typinferenz erforderlich, da der Komparator direkt innerhalb der Sortiermethode erstellt wird und die erforderlichen Typinformationen bereitstellt. Dies gilt jedoch nur für den ersten thenComparing-Aufruf. Nachfolgende Aufrufe ohne explizite Typparameter führen zu Fehlern.
Eclipse-spezifische Fehler
Es ist wichtig zu beachten, dass die aufgetretenen Fehler möglicherweise Eclipse-spezifisch waren. Das Kompilieren des Codes mit dem Javac-Compiler JDK 8 behebt diese Probleme häufig.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Inferenz des Java 8-Komparatortyps fehl, wenn „thenComparing'-Aufrufe verkettet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!