比较器 reversed() 导致编译器错误

Comparator reversed() is resulting in compiler error

假设以下 class 结构:

abstract class Animal<A extends Animal<A>> 
{
    ... someAbstractMethodDefinitions
}

class Duck<D extends Duck<D>> extends Animal<D> 
{
    public int getBeekSize()
    {
         return beekSize;
    }

    public int getHeadSize()
    {
         return headSize;
    }
}

class Mallard extends Duck<Mallard> 
{
    .. someCode
}

假设我有一个鸭子列表(不一定是绿头鸭),然后我想按大小比较鸭子。换句话说我想做的是:

List<Duck> ducks = Arrays.asList(new Duck(), new Duck(), ...);
Collections.sort(
        ducks,
        Comparator.comparing(Duck::getBeekSize).reversed());

当我尝试执行此操作时,出现编译器错误:"Non-static method cannot be referenced in a static context"。如果我删除 .reversed() 它工作得很好,一切都可以正确编译和运行。以下代码有效:

List<Duck> ducks = Arrays.asList(new Duck(), new Duck(), ...);
Collections.sort(
        ducks,
        Comparator.comparing(Duck::getBeekSize));

换句话说,为什么我可以在 Comparator 中添加一个 reversed()?两个代码块之间的唯一区别是删除了 .reversed()

你可以在这里找到类似的问题:Comparator.reversed() does not compile using lambda

解决方案是做这样的事情:

Collections.sort(ducks, Comparator.comparing((Duck d) -> d.getHeadSize()).reversed());

编辑:

添加与此问题相关的错误:

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8025138

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8025290