比较器 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
假设以下 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