Java 方法引用特定类型的任意对象的实例方法 为什么“a”::compareToIgnoreCase无法编译?如果我们可以说String::compareToIgnoreCase有一个隐式字符串参数(this),为什么我们不能说“a”::compareToIgnoreCase有一个隐式的“a”作为参数?(“a”比较“第一”,“a”比较“第二”…)

Java 方法引用特定类型的任意对象的实例方法 为什么“a”::compareToIgnoreCase无法编译?如果我们可以说String::compareToIgnoreCase有一个隐式字符串参数(this),为什么我们不能说“a”::compareToIgnoreCase有一个隐式的“a”作为参数?(“a”比较“第一”,“a”比较“第二”…),java,method-reference,Java,Method Reference,“a”::compareToIgnoreCase是对单个参数方法的方法引用,它将给定的字符串与字符串“a”进行比较。隐式参数始终等于“a” Comparator的Compare方法需要两个给定的String实例 如果将方法引用编写为lambda表达式,可能会更清楚: String[] arr = {"First", "Second", "Third", "Fourth"}; Arrays.sort(arr, Stri

“a”::compareToIgnoreCase
是对单个参数方法的方法引用,它将给定的
字符串
字符串
“a”进行比较。隐式参数始终等于“a”

Comparator
Compare
方法需要两个给定的
String
实例

如果将方法引用编写为lambda表达式,可能会更清楚:

String[] arr = {"First", "Second", "Third", "Fourth"};
Arrays.sort(arr, String::compareToIgnoreCase); //can compile
Arrays.sort(arr, "a"::compareToIgnoreCase); //can't compile

是的,在lambda表达式中思考总是比方法引用更清晰
Arrays.sort(arr, (a,b) -> a.compareToIgnoreCase(b)); //can compile

Arrays.sort(arr, (x) -> "a".compareToIgnoreCase(x)); // can't compile, since a method with 
                                                     // two arguments is expected