이 질문에는 이미 답변이 있습니다.
지도 항목 목록이 있습니다.
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"경고가 발생합니다.
컴파일러는이 경우 제네릭 형식 매개 변수를 추론 할만큼 충분히 똑똑하지 않습니다. 명시 적으로 지정할 수 있습니다.
entries.sort(Entry.<String, Integer>comparingByValue().reversed());
문제는 먼저 다음에 의해 반환 된 비교 자의 유형이 필요하다는 것입니다.comparingByValue
반환 된 유형을 알기 위해reversed
.
영리한 컴파일러가 거꾸로 작동하지 못하는 이유가별로 없습니다.sort
특정 유형이 필요합니다.reversed
특정 유형이어야합니다.comparingByValue
특정 유형이어야합니다. 그러나 그것은 사물이 아닌 방법입니다.
형식 유추가 계속 작업 중입니다 (최근 Java 10), 어쩌면 미래에 누가 알겠습니까.
당신이 줄이면
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