猿问

为什么我传递给Arrays.sort的方法引用必须是静态的?

我是Java 8的新手。我正在尝试创建一个示例,以引用特定类型的任意对象的实例方法。


我有一个具有一个字段Name的人员类,并尝试对人员类的firstName字段上的人员对象数组进行排序。


public class Person{


    String firstName;


    public Person(String firstName) {

        super();

        this.firstName = firstName;

    }


    public String getFirstName() {

        return firstName;

    }

    public void setFirstName(String firstName) {

        this.firstName = firstName;

    }

    public int compareByFirstName(Person p1, Person p2) {

        return p1.getFirstName().compareTo(p2.getFirstName());

    }


}


public class TestInstanceMethorRefArbObjSample {


    public static void main(String[] args) {

        TestInstanceMethorRefArbObjSample obj=new TestInstanceMethorRefArbObjSample();

        obj.personSorting();

    }


    private void personSorting() {

        Person[] personArr= {new Person("Jinesh"),new Person("Sejal"),new Person("Ashish")};

        Arrays.sort(personArr,Person::compareByFirstName);

    }

}

但是我在下面的行面临编译问题。


Arrays.sort(personArr,Person::compareByFirstName);

1.类型Person未定义在此处适用的compareByFirstName(T,T)TestInstanceMethorRefArbObjSample.java / InstaceMethodArbitaryObjectProject / src / com / methodreference / instancemethodrefarbitary / client line 11 Java问题2.类型Person未定义compareByFirstName(T,T )适用于此处TestInstanceMethorRefArbObjSample.java / InstaceMethodArbitaryObjectProject / src / com / methodreference / instancemethodrefarbitary / client line 11 Java问题


我只是想通过int compare(T o1,T o2)的实现;使用Person类的compareByFirstname。


一旦将Person类的compareByFirstname方法更改为静态,一切就可以正常工作。


为什么需要将compareByFirstname更改为静态方法才能使其正常工作?


子衿沉夜
浏览 138回答 2
2回答

临摹微笑

一些背景Arrays.sort需要一个Comparator,当传递一个方法引用时,它必须是一个接受两个适当类型实例的方法。有两种方法可以创建这种方法:在任何接受两个适当类型参数的类中创建一个静态方法。这基本上就是您所做的。这样的方法不需要在特定的类中声明,您还可以使用其他一些提供此类帮助器方法的类。您的编译器将确保生成的Comparator实例使用要比较的2个实例调用引用的方法。在特定类中为该类型创建一个实例方法,该方法接受适当类型的一个参数。您的编译器将确保所生成Comparator的实例以第2个实例为参数调用第一个实例上的引用方法。您的具体情况由于您的方法有两个参数,因此它必须是静态的,否则它将需要第三个实例来运行。要么声明它的静态或删除一个参数和执行之间的比较本和参数。

慕娘9325324

您正在使用方法引用,并且由于已编写它,因为Person::compareByFirstName它是在引用静态方法。如果要引用一个实例方法,则需要先创建该对象的一个实例,然后再将该实例与实例一起引用,如下所示:Person p = new Person("");p::compareByFirstName但是,这不是您要执行的操作,因为compare方法不是特定于实例的。您可以通过将对象实例与另一个对象进行比较,更改比较方法以使其特定于实例public int compareByFirstName(Person p2) {    return this.getFirstName().compareTo(p2.getFirstName());}在这种情况下,您可以使用方法参考,Person::compareByFirstName因为比较变得无用。
随时随地看视频慕课网APP

相关分类

Java
我要回答