【发布时间】:2018-03-24 06:29:20
【问题描述】:
假设类结构如下:
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());
当我尝试这样做时,我得到编译器错误:“非静态方法不能在静态上下文中引用”。如果我删除 .reversed() 它工作得很好,一切都编译并正确运行。以下代码有效:
List<Duck> ducks = Arrays.asList(new Duck(), new Duck(), ...);
Collections.sort(
ducks,
Comparator.comparing(Duck::getBeekSize));
换句话说,为什么我可以将reversed() 添加到我的Comparator 中?两个代码块之间的唯一区别是 .reversed() 被删除了。
【问题讨论】:
-
I couldn't reproduce your problem 和 minimal reproducible example (MCVE)。你能发布一个MCVE吗?或者,如果我的示例不适合您,请发布您使用的 Java 版本。
标签: java generics polymorphism comparator