为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

子衿沉夜 2021-05-14 22:10:48
我是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更改为静态方法才能使其正常工作?
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

一些背景

Arrays.sort需要一个Comparator,当传递一个方法引用时,它必须是一个接受两个适当类型实例的方法。

有两种方法可以创建这种方法:

  1. 任何接受两个适当类型参数的类中创建一个静态方法。这基本上就是您所做的。这样的方法不需要在特定的类中声明,您还可以使用其他一些提供此类帮助器方法的类。

您的编译器将确保生成的Comparator实例使用要比较的2个实例调用引用的方法。

  1. 特定类中为该类型创建一个实例方法,方法接受适当类型的一个参数。

您的编译器将确保所生成Comparator的实例以第2个实例为参数调用第一个实例上的引用方法。

您的具体情况

由于您的方法有两个参数,因此它必须是静态的,否则它将需要第三个实例来运行。要么声明它的静态或删除一个参数和执行之间的比较和参数。


查看完整回答
反对 回复 2021-05-26
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

您正在使用方法引用,并且由于已编写它,因为Person::compareByFirstName它是在引用静态方法。如果要引用一个实例方法,则需要先创建该对象的一个实例,然后再将该实例与实例一起引用,如下所示:


Person p = new Person("");

p::compareByFirstName

但是,这不是您要执行的操作,因为compare方法不是特定于实例的。


您可以通过将对象实例与另一个对象进行比较,更改比较方法以使其特定于实例


public int compareByFirstName(Person p2) {

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

}

在这种情况下,您可以使用方法参考,Person::compareByFirstName因为比较变得无用。


查看完整回答
反对 回复 2021-05-26
  • 2 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信