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


Stream Java 8中的类定义了一个 max 需要的方法 Comparator 论据。这是方法签名:

Optional<T> max(Comparator<? super T> comparator)

Comparator 是一个具有抽象的功能界面 compare 具有此签名的方法。注意 compare 需要2个参数。

int compare(T o1, T o2)

Comparable 界面有一个抽象 compareTo 具有此签名的方法。注意 compareTo 只需要一个参数。

int compareTo(T o)

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

int max = Stream.of(0, 4, 1, 5).max(Integer::compareTo).get();

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


11233
2018-05-17 14:06


起源

有关: stackoverflow.com/questions/22561614/... (你可以用 Integer::compare 代替 Integer::compareTo) - Marco13
您没有传递Integer实例。您正在传递对Integer.compareTo()方法的引用。那是完全不同的。 - JB Nizet
这非常有效。但是,使用 Comparator.naturalOrder() 对于类型实现 Comparable 可能更有效率。 - Holger


答案:


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

所以 Integer::compareTo 是一个方法的方法参考,期望两个 Integer 对象并返回一个 intComparator<Integer> 是一个 功能界面 对于功能,期望两个 Integer 对象并返回一个 int。这就是它起作用的原因。


12
2018-05-17 14:23



顺便说一句, Comparator<? super Integer> compareTo = Integer::compareTo; 也完美编译。 - Alexey Malev
我明白了 Integer::compareTo 相当于 (a, b) > a.compareTo(b)? - Bryan