Java 方法引用 String::compareTo 实现 Comparator<String> 是如何工作的?

How does Java method reference String::compareTo implementing Comparator<String> works?

java.util.Comparator<String> lambda = (s1, s2) -> s1.compareTo(s2); // line 1
java.util.Comparator<String> methodRef = String::compareTo;         // line 2

我不明白为什么第 2 行没有错误,为什么它等同于第 1 行。第 2 行返回一个方法引用,它接收一个字符串和 returns 和 int(即 int compare(String s) ),但是,比较器功能方法签名是 int compare(T o1, T o2);

String::compareTo 的引用是一种特殊的方法引用,称为 "Reference to an Instance Method of an Arbitrary Object of a Particular Type"

在这种情况下,编译器知道我们正在引用给定 class 的 not-static 方法,并且它可以转换为具有所需签名的功能接口。

例如:

String t1 = "t1";
String t2 = "t2";

// this
Comparator<String> comparator = String::compareTo;
comparator.compareTo(t1, t2);

// will be 'translated' to:
Comparator<String> comparator = (String s1, String s2) -> s1.compareTo(s2);
t1.compareTo(t2);

Note that the method will be called with the context of the first parameter (the this used will be t1).

State of lambda 的第 8 点和第 9 点给出了此实现的基本原理。

来自 Overview of method references youtube 视频