13

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

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

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

int compare(T o1, T o2)

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

int compareTo(T o)

在 Java 8 中,以下代码完美运行。但是,我预计会出现编译错误,例如“Integer 类未定义 compareTo(Integer, Integer)”。

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

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

4

1 回答 1

13

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

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

于 2014-05-17T14:23:54.783 回答