是否可以将方法引用与接口的静态方法一起使用?

这是我的第一个代码:


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 种情况下对类使用方法引用:


班级


类::静态方法


类::实例方法


实例::实例方法


类::新


功能接口


接口::抽象方法

非常感谢!


叮当猫咪
浏览 143回答 2
2回答

慕沐林林

Comparator.reverseOrder()是一个解析为Comparator类型的表达式,因为这就是它返回的内容。Comparator::reverseOrder是一个表达式,它解析为一个不带参数并返回一个Comparator例如 a 的方法Supplier<Comparator<String>>,尽管它可以是任何匹配的功能接口。在第二个实例中,您试图传递一个方法(提供 a&nbsp;Comparator)作为参数。该方法不想要那个 - 它只想要它Comparator自己。你可以这样想(只是伪代码来演示这一点):s.sorted(new&nbsp;Comparator())对比s.sorted(new&nbsp;Supplier(new&nbsp;Comparator()))回答关于是否可以对接口的静态方法使用方法引用的第二个问题 - 是的,绝对!如果我们声明以下方法:<T>&nbsp;void&nbsp;giveMeAComparatorSupplier(Supplier<Comparator<T>>&nbsp;supplier)&nbsp;{&nbsp;}那么我们绝对可以使用方法引用来调用它giveMeAComparatorSupplier(Comparator::reverseOrder);(仅供参考,您的方法引用语法是错误的 - 它从不使用())

蝴蝶刀刀

您的第二个代码有两处错误。首先,方法引用根本不使用括号或参数。您只需要提供稍后会调用的方法;那时您没有调用该方法。其次,该sorted方法采用Comparator,而不是提供Comparator.&nbsp;该方法需要一个Comparator已经创建并准备就绪的接口,而不是一个Comparator在需要时提供的功能接口。它与Comparator作为接口的事实无关;通常可以创建对static接口方法的方法引用。它与sorted需要实际Comparator实例而不是功能接口实例的事实有关,此时您可以提供方法引用。所以即使你去掉括号,它仍然不会编译。只有直接传递 a 的第一个代码Comparator才能按预期编译和工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java