是否可以使用方法引用和接口的静态方法?

Adr*_*r83 2 java lambda method-reference

这是我的第一个代码:

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);
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:灰熊熊

这是我的第二个代码:

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);
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:编译器错误

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

我知道我不能使用方法引用和函数接口的默认方法.我知道我可以在5种情况下使用类的方法引用:

  • 类:: STATICMETHOD

  • 类:: instanceMethod

  • 例如:: instanceMethod

  • 类::新

功能界面

  • 接口:: abstractMethod

非常感谢!

Mic*_*ael 6

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

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

在第二个实例中,您尝试将方法(提供a Comparator)作为参数传递.该方法不希望这样 - 它只是想要Comparator自己.

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

s.sorted(new Comparator())
Run Code Online (Sandbox Code Playgroud)

VS

s.sorted(new Supplier(new Comparator()))
Run Code Online (Sandbox Code Playgroud)

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

如果我们声明以下方法:

<T> void giveMeAComparatorSupplier(Supplier<Comparator<T>> supplier) { }
Run Code Online (Sandbox Code Playgroud)

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

giveMeAComparatorSupplier(Comparator::reverseOrder);
Run Code Online (Sandbox Code Playgroud)

(和你的方法参考语法错误 - 它永远不会使用())