> Java > java지도 시간 > Comparator.comparing().reversed()`가 람다에서 컴파일러 오류를 일으키는 이유는 무엇입니까?

Comparator.comparing().reversed()`가 람다에서 컴파일러 오류를 일으키는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-20 17:22:10
원래의
307명이 탐색했습니다.

Why Does `Comparator.comparing().reversed()` Cause a Compiler Error with Lambdas?

람다를 사용한 Comparator.reversed()의 컴파일러 오류 이해

람다 표현식을 사용하여 사용자 객체 목록을 정렬하려고 할 때 다음과 같은 비교기:

List<User> userList = Arrays.asList(u1, u2, u3);
userList.sort(Comparator.comparing(u -> u.getName()).reversed());
로그인 후 복사

컴파일러는 다음과 같은 오류를 표시할 수 있습니다. 람다의 u 변수에서 getName() 메서드를 찾을 수 없습니다. 이 문제는 컴파일러 유형 추론 메커니즘의 약점으로 인해 발생합니다.

이 오류를 해결하려면 람다에 대한 대상 유형을 설정해야 합니다. Comparator.comparing()을 사용하여 정렬할 때 람다는 목록의 객체와 동일한 유형의 인수를 가져와야 합니다.

메서드 참조를 사용하는 코드의 첫 번째 줄에서 대상 유형 User라는 메소드 매개변수 유형에서 유추됩니다. 이를 통해 컴파일러는 람다 내에서 u 유형을 올바르게 유추할 수 있습니다.

그러나 메서드 참조 대신 람다 표현식을 사용하는 세 번째 줄에서는 reversed() 호출이 대상 유형을 방해합니다. 추론. 컴파일러는 대상 유형을 수신자에게 다시 전파할 수 없으므로 사용자에게 getName() 메소드가 없는 추론된 유형의 Object가 남게 됩니다.

이 문제를 해결하려면 메소드 참조를 사용하거나 다음과 같이 람다에 u 유형을 명시적으로 지정합니다.

userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());
로그인 후 복사

이렇게 하면 컴파일러가 람다 내에서 u에 대한 올바른 유형을 추론하고 다음에 따라 목록을 성공적으로 정렬할 수 있습니다. 지정된 비교기.

위 내용은 Comparator.comparing().reversed()`가 람다에서 컴파일러 오류를 일으키는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿