Collectors.maxBy (Comparator.naturalOrder ())는 Long이 유추되지만 컴파일되지 않습니다.

Aug 21 2020

다음 코드를 컴파일 할 수 없습니다 ( onlinegdb 시도 ).

List<Container<Dto>> list = Arrays.asList(
                new Container<>(new Dto("A"), 10L),
                new Container<>(new Dto("A"), 30L),
                new Container<>(new Dto("B"), 30L));

Map<String, Optional<Long>> mapWrong = list.stream()
    .collect(Collectors.groupingBy(
        c -> c.getOutput().getType(),
        Collectors.mapping(
            Container::getDifference, 
            Collectors.maxBy(Comparator.naturalOrder()))));     // DOESN'T WORK WITH THIS 

호환되지 않는 유형 : 유형 변수를 추론 할 수 없습니다. T, U, A, R,?, T, T의 # 2 캡처 발견 : java.lang.Object 이유 : 실제 및 형식 인수 목록의 길이가 다릅니다)

컴파일 오류의 원인이 무엇인지 모르겠습니다. 는 Collectors.mapping새로운 값으로하고 있기 때문에 객체를 매핑 Container::getDifference반환 long과 똑같은 유형으로 유추해서도 안 Collectors.maxBy하고 코드 컴파일을하셔야합니다.

나는를 교체 할 때 놀랍게도 Comparator.naturalOrder()와 함께 Comparator.comparingLong(l -> l), 그것은 작동합니다.

Map<String, Optional<Long>> mapCorrect = list.stream()
    .collect(Collectors.groupingBy(
        c -> c.getOutput().getType(),
        Collectors.mapping(
            Container::getDifference, 
            Collectors.maxBy(Comparator.comparingLong(l -> l)))));   // A CHANGE TO FIX IT

사용 된 객체 (모든 인수 생성자 및 게터 포함) :

public class Container<T> {
    T output;
    long difference;
}
public class Dto {
    String type;
}

OpenJDK를 사용하여 jdk-11.0.5jdk1.8.0_212. IntelliJ Idea를 사용하고 IDE는 그러한 오류를 강조하지 않지만 컴파일시 발생합니다.

답변

7 Andreas Aug 21 2020 at 00:00

표준 Oracle / OpenJDK 컴파일러 버전 8 ~ 14의 추론 엔진은 진행 상황을 올바르게 추적 할 수 없습니다.

그러나 Eclipse의 컴파일러는 가능하므로 다른 사람들은 문제를 재현 할 수 없다고 말합니다.

다음을 지정하여 도움이 필요합니다.

Collectors.maxBy(Comparator.<Long>naturalOrder()))));     // THIS NOW WORKS