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

为什么java中不允许Random::nextInt作为方法引用?,java,java-8,Java,Java 8,所以我在读泛型和函数接口。这里展示了两种方法——使用Lambdas,使用方法引用。使用的例子如下: Predicate<String> ref = String::isEmpty; 谓词ref=String::isEmpty; Java使用运行时提供的参数作为调用isEmpty的实例。这是允许的,因为isEmpty()是String类中的实例方法,不接受任何参数 我的问题是,当我使用以下代码行时,为什么会显示编译错误: Supplier<Integer> ref2 =

所以我在读泛型和函数接口。这里展示了两种方法——使用Lambdas,使用方法引用。使用的例子如下:

Predicate<String> ref = String::isEmpty;
谓词ref=String::isEmpty;
Java使用运行时提供的参数作为调用isEmpty的实例。这是允许的,因为isEmpty()是String类中的实例方法,不接受任何参数

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

Supplier<Integer> ref2 = Random::nextInt;
Supplier ref2=Random::nextInt;

毕竟,nextInt()是随机类中的一个实例方法,就像字符串类中的isEmpty()一样,它也不带参数。

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

类似地,
Random::nextInt
需要一个Random实例作为参数,并返回一个int。因此它可以用作
函数
;但不是
供应商
,因为它不能在没有参数的情况下调用

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

Random random = new Random();
Supplier<Integer> randomIntSupplier = random::nextInt;
Random Random=new Random();
供应商randomIntSupplier=random::nextInt;

String::isEmpty
将字符串作为参数。按照相同的逻辑,
Random::nextInt
需要一个Random作为参数。因此,它将是一个函数,而不是一个供应商。在
Random::nextInt
中,您在哪个随机实例上调用nextInt?什么种子被用来初始化它?nextInt不是静态方法,因此必须传递现有随机实例的nextInt方法。就像你不能在代码中写
Random.nextInt()
。你可以改为写
newrandom()::nextInt
。谢谢你的回答。我想我现在明白多了。