假设有以下类结构:
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()
。
答案 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