Heim > Java > javaLernprogramm > Warum verursacht „Comparator.reversed()' Kompilierungsfehler mit Java-Lambda-Ausdrücken?

Warum verursacht „Comparator.reversed()' Kompilierungsfehler mit Java-Lambda-Ausdrücken?

Susan Sarandon
Freigeben: 2024-12-15 06:22:11
Original
193 Leute haben es durchsucht

Why Does `Comparator.reversed()` Cause Compilation Errors with Java Lambda Expressions?

Compiler-Falle: Comparator.reversed() und Lambda-Ausdrücke

Lambda-Ausdrücke bieten eine prägnante Möglichkeit, das Sortierverhalten anzupassen, aber wenn sie mit verwendet werden Comparator.reversed() tritt ein Kompilierungsfehler auf. Dieser Fehler ist auf die Unfähigkeit des Compilers zurückzuführen, den richtigen Zieltyp für das Lambda abzuleiten.

Den Fehler verstehen

Bedenken Sie den folgenden Beispielcode:

userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error
Nach dem Login kopieren

In diesem Fall tritt der Fehler auf, weil der Compiler den Typ des Parameters u im Lambda-Ausdruck nicht bestimmen kann. Um den Typ abzuleiten, benötigt der Compiler einen Zieltyp für das Lambda.

Normalerweise wird der Zieltyp durch den Kontext festgelegt, in dem das Lambda verwendet wird. In der ersten Zeile des von Ihnen bereitgestellten Codeausschnitts ist der Zieltyp Comparator, da userList.sort() ein Argument dieses Typs erwartet. Daraus lässt sich schließen, dass Sie vom Typ „Benutzer“ sind, sodass der Code kompiliert werden kann.

Lambda vs. Methodenreferenz

Der Fehler tritt nur auf, wenn ein Lambda-Ausdruck verwendet wird. Bei Verwendung einer Methodenreferenz (wie in der zweiten Zeile Ihres Codeausschnitts) wird der Zieltyp explizit durch die Methodensignatur bereitgestellt, wodurch das Problem der Typinferenz behoben wird.

Fehlerbehebung

Um den Fehler bei der Verwendung eines Lambda-Ausdrucks zu beheben, können Sie den Parametertyp explizit angeben:

userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());
Nach dem Login kopieren

Damit wird u explizit angegeben vom Typ „Benutzer“, sodass der Compiler den Zieltyp korrekt ableiten kann.

Compiler-Schwäche

Der fragliche Fehler weist auf eine Schwäche im Typ-Inferenzmechanismus des Compilers hin. Der genaue Grund, warum die Methode reversed() die Zieleingabe stört, ist unklar. Zukünftige Compiler-Verbesserungen könnten dieses Problem beheben und die Verwendung von Lambda-Ausdrücken ohne explizite Parametertypisierung ermöglichen.

Das obige ist der detaillierte Inhalt vonWarum verursacht „Comparator.reversed()' Kompilierungsfehler mit Java-Lambda-Ausdrücken?. 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