所以我正在阅读泛型和函数式接口。显示了两种方法 - 使用 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() 一样,它也不带参数。
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)
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |