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

时间:2018-03-24 06:29:21

标签: java generics polymorphism comparator

假设有以下类结构:

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
}

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

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

当我尝试这样做时,我得到编译器错误:&#34;非静态方法不能在静态上下文中引用&#34;。如果我删除.reversed(),它的工作效果很好,一切都可以编译并正确运行。以下代码有效:

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

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

1 个答案:

答案 0 :(得分:1)

您可以在此处找到类似的问题: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