函数接口方法调用

问题描述 投票:0回答:1

为什么这段代码没有返回任何输出?

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 方法的警告)。 预先感谢您的解释!

java functional-interface
1个回答
0
投票

需要明确的是,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
的返回值。

© www.soinside.com 2019 - 2024. All rights reserved.