为什么 Random::nextInt 在 java 中不允许作为方法引用?

Bha*_*shi 2 java java-8

所以我正在阅读泛型和函数式接口。显示了两种方法 - 使用 Lambda,使用方法引用。使用了以下示例:

Predicate<String> ref = String::isEmpty;
Run Code Online (Sandbox Code Playgroud)

Java 使用在运行时提供的参数作为调用 isEmpty 的实例。这是允许的,因为 isEmpty() 是 String 类中的一个实例方法并且不带任何参数。

我的问题是,当我使用以下代码行时,为什么会显示编译错误:

Supplier<Integer> ref2 = Random::nextInt;
Run Code Online (Sandbox Code Playgroud)

毕竟 nextInt() 是 Random 类中的实例方法,就像 String 类中的 isEmpty() 一样,它也不带参数。

khe*_*ood 8

Random::nextInt是一个实例方法,所以它需要一个实例Random才能被调用。就像String::isEmpty没有字符串就不能调用一样。这就是String::isEmpty匹配 for的原因Predicate<String>:它接受一个字符串作为参数并返回一个布尔值。

同样,Random::nextInt需要一个 Random 实例作为参数,并返回一个 int。所以它可以用作Function<Random, Integer>; 但不是 a Supplier<Integer>,因为它不能在没有参数的情况下被调用。

或者,如果您有一个 Random 实例,您可以使用对该特定实例nextInt方法的引用作为供应商。

Random random = new Random();
Supplier<Integer> randomIntSupplier = random::nextInt;
Run Code Online (Sandbox Code Playgroud)