Java,为什么collections.sort()仍然适用于非比较器类型的参数?

Urc*_*ase 6 java collections lambda

我知道在java Collections类中,有一个静态方法排序:

sort(List<T> list, Comparator<? super T> c**)
Run Code Online (Sandbox Code Playgroud)

sort中的第二个参数应该是一个实现Comparator接口的对象,它是比较方法.

但是当我学习lambda的方法参考时,我看到了这个例子:

public class Test 
{
     public static void main(String[] args) 
    {
        new Test().sortWord();  
    }

    public void sortWord()
    {
        List<String> lst = new ArrayList<>();
        lst.add("hello");
        lst.add("world");
        lst.add("apple");
        lst.add("zipcode");

        Collections.sort(lst, this::compareWord);

        System.out.println(lst);
    }

    public int compareWord(String a, String b)
    {
       return a.compareTo(b);
    }
Run Code Online (Sandbox Code Playgroud)

}

这是例如方法的方法参考的示例.compareWord方法与Comparator接口无关,我无法理解为什么这样有效?谁有人解释这个?

非常感谢你.

Era*_*ran 7

int compareWord(String a, String b)具有与接口int compare(String o1, String o2)方法相同的签名Comparator<String>.因此,它可以用作该接口的实现.

这是一种较短的写作方式:

Collections.sort(lst, new Comparator<String> () {
                     public int compare (String o1, String o2) {
                         return compareWord(o1,o2);
                     }
                 });
Run Code Online (Sandbox Code Playgroud)

在Java 8中,任何功能接口(例如Comparator具有单个抽象方法的接口)可以用具有与该接口的抽象方法的签名匹配的签名的方法的方法引用来实现.