0

이 질문에는 이미 답변이 있습니다.

지도 항목 목록이 있습니다.

Map<String, Integer> map = new HashMap<>();
...(fill the map)...
List<Entry<String, Integer>> entries = new ArrayList<>(map.entrySet());

값에 따라 정렬하고 싶습니다.이 대답, 반대 순서로. 내가 할 때

Comparator<Entry<String, Integer>> cmp = Entry.comparingByValue();
entries.sort(cmp.reversed());

모든 것이 잘 작동합니다. 하지만 위의 두 줄을 줄이려고하면

entries.sort(Entry.comparingByValue().reversed());

컴파일러가 리턴한다.

error: incompatible types: Comparator<Entry<Object,V>> cannot be converted to Comparator<? super Entry<String,Integer>>
        entries.sort(Entry.comparingByValue().reversed());
  where V is a type-variable:
    V extends Comparable<? super V>

이것은 이상하게 보입니다. Comparator 'sreversed()기본 메소드는Collections.reverseOrder()위의 줄을 다음과 같이 변경할 수 있습니다.

entries.sort(Collections.reverseOrder(Entry.comparingByValue()));

일하다. 그러나 올바른 유형은 무엇입니까?Entry.comparingByValue().reversed()?

Comparator<Entry<String, Integer>> cmp = Entry.comparingByValue().reversed();

작동하지 않는 것 같습니다. 형식 매개 변수 생략Entry<String, Integer>작동하지만 나중에 컴파일러에서 "unchecked method invocation"경고가 발생합니다.


  • 이 질문에 대한 답을 확인하십시오.stackoverflow.com/questions/24794924/… - ernest_k
  • @ernest_k 네가 그렇듯. 누군가가 " 경쟁 우위 "에 대해 이것을 닫은 것으로 생각하는 경우를 대비해 내 답변을 커뮤니티 위키로 표시했습니다. - Michael
  • 고마워요 @ 마이클 - ernest_k

2 답변


3

컴파일러는이 경우 제네릭 형식 매개 변수를 추론 할만큼 충분히 똑똑하지 않습니다. 명시 적으로 지정할 수 있습니다.

entries.sort(Entry.<String, Integer>comparingByValue().reversed());

문제는 먼저 다음에 의해 반환 된 비교 자의 유형이 필요하다는 것입니다.comparingByValue반환 된 유형을 알기 위해reversed.

영리한 컴파일러가 거꾸로 작동하지 못하는 이유가별로 없습니다.sort특정 유형이 필요합니다.reversed특정 유형이어야합니다.comparingByValue특정 유형이어야합니다. 그러나 그것은 사물이 아닌 방법입니다.

형식 유추가 계속 작업 중입니다 (최근 Java 10), 어쩌면 미래에 누가 알겠습니까.


1

당신이 줄이면

Comparator<Entry<String, Integer>> cmp = Entry.comparingByValue();
entries.sort(cmp.reversed());

entries.sort(Entry.comparingByValue().reversed());

당신은 수집 된 정보를 제거합니다.cmp선언. 컴파일러는 여전히 해당 정보를 알아야하므로 일반 입력을에 추가해야합니다.Entry:

entries.sort(Entry.<String, Integer>comparingByValue().reversed());


  • 죄송합니다..잘못된 곳에서. 이제 해결되었습니다. - MTCoster

연결된 질문


관련된 질문

최근 질문