Heim > Java > javaLernprogramm > Warum schlägt die Inferenz des Java 8-Komparatortyps fehl, wenn „thenComparing'-Aufrufe verkettet werden?

Warum schlägt die Inferenz des Java 8-Komparatortyps fehl, wenn „thenComparing'-Aufrufe verkettet werden?

Susan Sarandon
Freigeben: 2024-11-28 12:53:11
Original
377 Leute haben es durchsucht

Why Does Java 8 Comparator Type Inference Fail When Chaining `thenComparing` Calls?

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);
Nach dem Login kopieren

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
Nach dem Login kopieren

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)));
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage