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

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

Susan Sarandon
풀어 주다: 2024-12-15 06:22:11
원래의
192명이 탐색했습니다.

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

컴파일러 함정: Comparator.reversed() 및 Lambda 표현식

Lambda 표현식은 정렬 동작을 사용자 정의하는 간결한 방법을 제공하지만 다음과 함께 사용할 경우 Comparator.reversed(), 컴파일 오류가 발생합니다. 이 오류는 컴파일러가 람다에 대한 올바른 대상 유형을 유추할 수 없기 때문에 발생합니다.

오류 이해

다음 샘플 코드를 고려하세요.

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

이 경우 컴파일러가 람다 표현식에서 매개변수 u의 유형을 판별할 수 없기 때문에 오류가 발생합니다. 유형을 추론하려면 컴파일러에는 람다에 대한 대상 유형이 필요합니다.

일반적으로 대상 유형은 람다가 사용되는 컨텍스트에 의해 설정됩니다. 제공한 코드 조각의 첫 번째 줄에서 대상 유형은 Comparator입니다. userList.sort()는 해당 유형의 인수를 기대하기 때문입니다. 이는 u가 User 유형이라고 추론하여 코드를 컴파일할 수 있도록 합니다.

Lambda 대 메서드 참조

이 오류는 람다 식을 사용할 때만 발생합니다. 코드 조각의 두 번째 줄과 같이 메소드 참조를 사용하는 경우 대상 유형은 메소드 시그니처에 의해 명시적으로 제공되어 유형 추론 문제를 해결합니다.

오류 해결

람다 표현식을 사용할 때 발생하는 오류를 해결하려면 매개변수를 명시적으로 제공하면 됩니다. 유형:

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

이것은 u가 User 유형이 되도록 명시적으로 지정하여 컴파일러가 대상 유형을 올바르게 유추할 수 있도록 합니다.

컴파일러 약점

문제의 오류는 컴파일러 유형 추론 메커니즘의 약점을 강조합니다. reversed() 메서드가 대상 입력을 방해하는 정확한 이유는 불분명합니다. 향후 컴파일러 개선을 통해 명시적인 매개변수 입력 없이 람다 표현식을 사용할 수 있도록 하여 이 문제를 해결할 수 있습니다.

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

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