代码之家  ›  专栏  ›  技术社区  ›  Nikolas Charalambidis

收集器.maxBy(比较器自然领主())无法编译,尽管推断了Long

  •  0
  • Nikolas Charalambidis  · 技术社区  · 5 年前

    我不能编译下面的代码(尝试 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,capture#2 of?,T,T 找到: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.5 jdk1.8.0_212

    0 回复  |  直到 5 年前
        1
  •  8
  •   Ryuzaki L    5 年前

    标准Oracle/OpenJDK编译器(版本8到14)的推理引擎无法正确跟踪正在发生的事情。

    但是,Eclipse的编译器可以,这就是为什么其他人说他们不能重现这个问题。

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