首页 > 解决方案 > Java如何处理实例方法的方法引用?

问题描述

我正在阅读Oracle 的 Java SE 关于方法引用的教程,我遇到了方法引用解析实例方法的机制的问题。

在本教程中,有一个使用方法引用作为Comparator<String>参数的片段。

Arrays.sort(stringArray, String::compareToIgnoreCase);

我认为Comparator<String>应该实现一个对象,compare(String, String)而不是采用一个显式参数的实例方法。Java 的编译器如何处理这个问题,或者在编译时发生了什么?

在了解了 JVM 之后,我了解到隐式参数是作为参数传递的。但这并没有帮助我理解 Java 编译器如何处理这个方法引用。

有人可以帮我找到这方面的教程或文档吗?我需要更多了解哪个部分?

标签: javalambdamethod-reference

解决方案


String::compareToIgnoreCase符合,Comparator<String>因为它确实接受两个字符串参数并返回一个 int。第一个参数是调用实例方法的 String 实例。第二个参数是要传递给该实例方法的(单个)参数。

和这个一样

(a, b) -> a.compareToIgnoreCase(b)

或更详细地说

(String a, String b) -> { 
    return a.compareToIgnoreCase(b);
}

所以是的,compareToIgnoreCase只需要一个参数,但String::compareToIgnoreCase需要两个。

"foo"::compareToIgnoreCase将其与(或说,someSpecificStr::compareToIgnoreCase)进行对比。在这里,实例已经被绑定,所以它只需要一个参数。


推荐阅读