方法参考:新位置

时间:2019-03-11 20:23:19

标签: java new-operator method-reference

我知道有四个方法参考:

  • Class :: new

  • Class ::静态方法

  • instance ::实例方法

  • Class ::实例方法

在本练习中,我发现了方法引用的另一种形式,我想问你这是怎么可能的。

class Person{     
    String name;     
    String dob;     
    public Person(String name, String dob){         
        this.name = name; this.dob = dob;     
    } 
} 

class MySorter {     
    public int compare(Person p1, Person p2){         
        return p1.dob.compareTo(p2.dob);     
    } 
} 

public class SortTest {     
    public static int diff(Person p1, Person p2){         
        return p1.dob.compareTo(p2.dob);     
    }          

    public static int diff(Date d1, Date d2){         
        return d1.compareTo(d2);     
    }     

    public static void main(String[] args) {         
        ArrayList<Person> al = new ArrayList<>();         
        al.add(new Person("Paul", "01012000"));         
        al.add(new Person("Peter", "01011990"));         
        al.add(new Person("Patrick", "01012002"));                           
        //INSERT CODE HERE     
    } 
}

在此练习中,有必要指出可以将上述几行彼此独立地插入给定代码中,以对al引用的列表进行排序:

  1. java.util.Collections.sort(al,(p1,p2)-> p1.dob.compareTo(p2.dob));
  2. java.util.Collections.sort(al,SortTest :: diff);
  3. java.util.Collections.sort(al,new MySorter():: compare);

我认为正确答案是1和2。但是此练习的解决方案表明所有行(1、2和3)都是正确的。

如何创建“新的Class:staticMethod”?

非常感谢!

A。

2 个答案:

答案 0 :(得分:2)

所有三个版本均可使用:

  • java.util.Collections.sort(al, (p1, p2)->p1.dob.compareTo(p2.dob));

是调用SortTest::diff的lambda版本

  • java.util.Collections.sort(al, SortTest::diff);

将起作用,因为它使用的是对静态方法的方法引用:

public static int diff(Person p1, Person p2){         
    return p1.dob.compareTo(p2.dob);     
}

  • java.util.Collections.sort(al, new MySorter()::compare);

之所以可行,是因为new MySorter()创建了类型为MySorter的对象,然后::compare将方法引用传递给合法的实例方法compare

答案 1 :(得分:1)

  

如何创建“新的Class:staticMethod”?

没有并不重要,存在一个实例,编译器将选择 className 并直接调用静态方法。

enter image description here

图片来源是here