将可比的实例传递给需要比较器的方法

Java 8 中的类定义了一个需要参数的方法。下面是方法签名:StreammaxComparator

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

Comparator是一个函数接口,它具有具有此签名的抽象方法。通知需要 2 个参数。comparecompare

int compare(T o1, T o2)

该接口具有具有此签名的抽象方法。通知只需要 1 个参数。ComparablecompareTocompareTo

int compareTo(T o)

在 Java 8 中,以下代码可以完美地工作。但是,我预计会出现一个编译错误,例如“Integer类不定义compareTo(Integer,Integer)”。

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

有人能帮助解释为什么可以将 的实例传递给一个方法,即使其方法签名不兼容,该方法也期望一个实例?ComparableComparator


答案 1

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

因此,方法的方法引用需要两个对象并返回 . 是函数的功能接口,需要两个对象并返回一个 .这就是它工作的原因。Integer::compareToIntegerintComparator<Integer>Integerint


答案 2

推荐