我最近接触了 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());
}
}
最佳答案
正如 greg-449 指出的那样,您的代码有一个错误。
通过像 YourObjet::yourMethod
这样的方法引用,您可以对实例的方法进行static 引用。因此将为每个对象调用该方法,因此签名需要与之前的不同
将编译的代码将具有以下形式:
Demo2[] demos = {a, b};
Arrays.sort(demos, Demo2::compareTo);
public class Demo2 {
Integer i;
Demo2(Integer i1){
i = i1;
}
public Integer getI() {
return i;
}
public int compareTo(Demo2 other) {
return this.getI().compareTo(other.getI());
}
}
但正如 RealSkeptic 指出的那样,这不是实现和对象比较的正确方法。您应该给 Arrays.sort 方法一个比较器:
Arrays.sort(demos, (obj1, obj2) -> obj1.getI().compareTo(obj2.getI()));
关于java - 方法引用中的类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39073799/