【发布时间】:2016-08-22 07:40:11
【问题描述】:
我最近开始使用 Java 8 并尝试使用方法引用。 我尝试了不同类型的方法引用,却陷入了“对特定类型的任意对象的实例方法的引用”类型中。
String[] arr = {"First", "Second", "Third", "Fourth"};
Arrays.sort(arr, String::compareToIgnoreCase);
这很好用。但是当我尝试通过其类型引用用户定义类的方法时:
Demo2[] arr = {a, b};
Arrays.sort(arr, Demo2::compare);
这会将编译时错误显示为“无法从静态上下文引用非静态方法”。
这是 Demo2 类:
public class Demo2 implements Comparator<Demo2> {
Integer i;
Demo2(Integer i1){
i = i1;
}
public Integer getI() {
return i;
}
@Override
public int compare(Demo2 o1, Demo2 o2) {
return o1.getI().compareTo(o2.getI());
}
}
【问题讨论】:
-
看
StringcompareToIgnoreCase方法的声明。 -
一般来说,如果你将一个类声明为
Comparator,而不是Comparable,那么你的设计是错误的。Comparator应该用于比较不能自然比较的对象。作为一个对象,它与它比较的对象是分开的,并且只包含有助于它进行比较的状态。 -
这似乎是
Comparator和Comparable之间相当标准的混淆。
标签: java java-8 method-reference