为什么这段代码没有返回任何输出?
public class Test {
public static Runnable print() {
return () -> System.out.println("Hello world!!!");
}
public static void main(String[] args) {
Runnable r = Test ::print;
r.run();
}
} 这看起来是正确的
Runnable r = Test ::print
(但 Intellij 添加了不会调用 print 方法的警告)。
预先感谢您的解释!
需要明确的是,IntelliJ 是说“‘Test.print()’的结果被忽略”,而不是说
print
不会被调用。
“
print
的结果”是什么?好吧,print
返回一个 Runnable
- 这:
() -> System.out.println("Hello world!!!")
你怎么忽略了它?您将
Test::print
的方法引用分配给 Runnable
:
Runnable r = Test::print;
Runnable
表示不带参数并返回 void
(即无返回值)的函数。您是说,声明返回 print
的 Runnable
应该分配给 r
,存储一个不返回任何内容的函数。这显然忽略了print
的返回值。
请注意,您没有将
print
的返回值分配给 r
,而是将方法 print
本身 分配给 r
,在 print
之前根本不调用 r.run()
。
将
print
的返回值赋值给r
可以写成:
Runnable r = Test.print();
这不是“忽略
print
的结果”,因为您正在将该结果分配给 r
。
让我们看一个不太令人困惑的例子:
public static String getString() {
return "some string";
}
public static void main(String[] args) {
Runnable r = Test::getString;
r.run();
}
以同样的方式,您说的是,声明为返回
getString
的 String
应该分配给 r
,它存储了一个不返回任何内容的函数。事实上 print
特别返回 Runnable
与 r
无关。重要的是,print
返回something,而r
不返回值,因此您忽略了print
的返回值。