方法参考中的类型推断

Har*_*ngh 3 java java-8 method-reference

我最近把手放在Java 8上并尝试使用方法参考.我正在尝试不同类型的方法引用,并陷入"引用特定类型的任意对象的实例方法"类型中.

String[] arr = {"First", "Second", "Third", "Fourth"};

Arrays.sort(arr, String::compareToIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

这非常有效.但是当我尝试通过其类型引用用户定义类的方法时:

Demo2[] arr = {a, b};

Arrays.sort(arr, Demo2::compare);
Run Code Online (Sandbox Code Playgroud)

这将编译时错误显示为"无法从静态上下文引用非静态方法".

这是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());
    }
}
Run Code Online (Sandbox Code Playgroud)

loi*_*ieu 5

正如greg-449指出的那样,你的代码有一个bug.

通过制作方法引用,就像对实例的方法YourObjet::yourMethod进行静态引用一样.因此,将为每个对象调用该方法,因此签名需要与之前的不同

将编译的代码将具有以下形式:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

但正如RealSkeptic指出的那样,这不是实现和对象比较的正确方法.你应该给Arrays.sort方法一个比较器:

 Arrays.sort(demos, (obj1, obj2) -> obj1.getI().compareTo(obj2.getI()));
Run Code Online (Sandbox Code Playgroud)

  • 实际上,在你的例子中使用`compareTo`是完全没问题的,它实际上并不是任何接口的一部分(尽管如果你声明`Demo2实现了Comparable <Demo2>`它也没关系,尽管你不需要` Arrays.sort(阵列,比较器)`).我的评论是关于滥用"比较器"界面,当有人实际上意味着"可比较". (2认同)