首页 > 解决方案 > 是否可以将方法引用与接口的静态方法一起使用?

问题描述

这是我的第一个代码:

public class MethodReference {
    public static void main (String []args) {
        Stream<String> s = Stream.of("brown bear", "grizzly");
        s.sorted(Comparator.reverseOrder()).forEach(System.out::print);
        //...
    }
}

结果:灰棕熊

这是我的第二个代码:

public class MethodReference {
    public static void main (String []args) {
        Stream<String> s = Stream.of("brown bear", "grizzly");
        s.sorted(Comparator::reverseOrder()).forEach(System.out::print);
        //...
    }
}

结果:编译器错误

我的问题:为什么第二个代码中有编译器错误?我不能将方法引用用于功能接口的静态方法吗?

我知道我不能将方法引用与功能接口的默认方法一起使用。我知道我可以在 5 种情况下对类使用方法引用:

班级

功能接口

非常感谢!

标签: javalambdamethod-reference

解决方案


Comparator.reverseOrder()是一个解析为类型的表达式Comparator,因为这就是它返回的内容。

Comparator::reverseOrder是一个表达式,它解析为不带参数并返回例如 a 的方法,尽管它可以是任何匹配的功能接口。ComparatorSupplier<Comparator<String>>

在第二种情况下,您尝试将方法(提供 a Comparator)作为参数传递。该方法不想要那个 - 它只想要它Comparator自己。

你可以这样想(只是伪代码来证明这一点):

s.sorted(new Comparator())

对比

s.sorted(new Supplier(new Comparator()))

要回答您的第二个问题,即是否可以将方法引用用于接口的静态方法 - 是的,绝对!

如果我们声明以下方法:

<T> void giveMeAComparatorSupplier(Supplier<Comparator<T>> supplier) { }

那么我们绝对可以用方法引用来调用它

giveMeAComparatorSupplier(Comparator::reverseOrder);

(仅供参考,您的方法参考语法是错误的 - 它从不使用()


推荐阅读