gpt4 book ai didi

java - 可作为方法引用运行

转载 作者:行者123 更新时间:2023-12-03 23:59:05 27 4
gpt4 key购买 nike

为什么这段代码不能编译?无法完全掌握细微差别的 java 方法引用:(

public class TestClass {

static void println() {}

public static void main(String[] args) {

Runnable r1 = () -> System.out::println; // compilation error
Runnable r2 = () -> TestClass::println; // compilation error
Runnable r2 = () -> System.out.println("Hello World"); // This is fine !!

}
}

最佳答案

这里有一点误解,其他答案只提供最终结果。所以这里有一个真实的解释。

在 java 中,有 lambda(() -> something)和方法引用(Class::method)。它们基本上是一样的,只是语法不同(更短)。如果您愿意,您可以混合使用 lambda 和方法引用(lambda 中的 lambda,lambda 中的方法引用)。只要一切都是正确的类型,就可以了。

所以 System.out::printlnConsumer<String> 类型的方法引用, 原因 System.out.println()需要String作为参数,并返回 void - 那是 Consumer<String> . (还有 System.out.println() 不带参数,在这种情况下它会是 Runnable )

Runnable有点不同,因为它不接收任何参数或返回值。示例可以是 List::clear .

至于为什么你的代码是编译错误:

在声明 Runnable 时作为 lambda,您必须不接收任何参数并返回 void .这个 lambda:Runnable r1 = () -> System.out::println;不符合条件,因为它没有接收任何参数( () -> ),但它的表达式确实返回了一个类型 - Consumer<String> (或 Runnable 再次),而不是 void .它可能是有效的 Runnable如果你没有返回任何东西,比如

Runnable r1 = () ->  {
Consumer<String> str1 = System.out::println; // either this
Runnable str2 = System.out::println; // or this
return; // return type - void
}

但这有点没有意义。

所以你可以清楚地看到 () -> System.out::println()实际上是一个提供 Runnable 的 lambda或 Consumer<String> ,所以它的类型应该是

Supplier<Runnable> s = () -> System.out::println; // either this
Supplier<Consumer<String>> s = () -> System.out::println; // or this

要直接使用它,您只需要放弃 Supplier<>

Runnable s = System.out::println; // either this
Consumer<String> s = System.out::println; // or this

您只需解释一下您要做什么,我们会为您提供帮助。

关于java - 可作为方法引用运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65088705/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com