将Comparable的实例传递给期望Comparator的方法

Bry*_*yan 11 java comparable comparator java-8 functional-interface

StreamJava 8中的类定义了一个max需要Comparator参数的方法.这是方法签名:

Optional<T> max(Comparator<? super T> comparator)
Run Code Online (Sandbox Code Playgroud)

Comparator是一个compare具有此签名的抽象方法的功能接口.通知compare需要2个参数.

int compare(T o1, T o2)
Run Code Online (Sandbox Code Playgroud)

Comparable接口具有compareTo带此签名的抽象方法.通知compareTo只需要1个参数.

int compareTo(T o)
Run Code Online (Sandbox Code Playgroud)

在Java 8中,以下代码完美地运行.但是,我期望编译错误,例如"Integer类没有定义compareTo(Integer,Integer)".

int max = Stream.of(0, 4, 1, 5).max(Integer::compareTo).get();
Run Code Online (Sandbox Code Playgroud)

有人可以帮助解释为什么即使他们的方法签名不兼容Comparable,Comparator也可以将实例传递给期望实例的方法?

nos*_*sid 12

这是关于方法引用的一个很好的功能.请注意,这Integer::compareTo是一个实例方法.你需要两个Integer对象来调用它.一个在左侧(目标对象),一个在右侧(第一个也是唯一的参数).

Integer::compareTo方法的方法引用也是如此,它需要两个Integer对象并返回一个int.Comparator<Integer>函数的函数接口,它期望两个Integer对象并返回一个int.这就是它起作用的原因.

  • 我明白了,所以`Integer::compareTo` 等价于`(a, b) &gt; a.compareTo(b)`? (2认同)