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

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

Barbara Streisand
Barbara StreisandOriginal
2024-12-14 20:05:17732Durchsuche

Why Does Java 8's `Comparator.reversed()` Cause Type Inference Conflicts with Lambda Expressions?

Typinferenzkonflikte behindern umgekehrte Lambda-Komparatoren

Trotz ihrer weit verbreiteten Verwendung stellt die Comparator.reversed()-Methode von Java 8 in Kombination eine Kompilierungshürde dar mit Lambda-Ausdrücken, was zu folgendem Fehler führt:

com\java8\collectionapi\CollectionTest.java:35: error: cannot find symbol
            userList.sort(Comparator.comparing(u -> u.getName()).reversed());
                                                     ^
symbol:   method getName()
location: variable u of type Object
1 error

Dieses Problem ist auf eine Einschränkung im Typinferenzmechanismus des Compilers zurückzuführen. Wenn ein Lambda-Ausdruck mit Comparator.comparing() verwendet wird, ist ein Zieltyp erforderlich, um auf den Typ des Parameters zu schließen. Im ersten Beispiel wird aufgrund des folgenden Zieltyps festgestellt, dass u vom Typ „Benutzer“ ist:

Comparator.comparing() -> Function<User, User.getName()> -> User

Wenn jedoch reversed() eingeführt wird, wird der Zieltyp gestört und der Compiler kann nicht mehr Den richtigen Typ ableiten.

Um dieses Problem zu lösen, kann man auf die Verwendung von Methodenreferenzen zurückgreifen, die zusätzlichen Typ bereitstellen Informationen:

userList.sort(Comparator.comparing(User::getName).reversed());

Alternativ kann ein expliziter Parametertyp im Lambda angegeben werden:

userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());

Es bleibt abzuwarten, ob zukünftige Compilererweiterungen diese Hürde bei der Typinferenz beheben werden.

Das obige ist der detaillierte Inhalt vonWarum verursacht „Comparator.reversed()' von Java 8 Typinferenzkonflikte mit Lambda-Ausdrücken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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