为什么以下示例中的第一个示例无法正常工作?
run(R::new);
方法R.run
没有被调用。run(new R());
方法R.run
会 被调用。
这两个示例都可以编译。
public class ConstructorRefVsNew {
public static void main(String[] args) {
new ConstructorRefVsNew().run(R::new);
System.out.println("-----------------------");
new ConstructorRefVsNew().run(new R());
}
void run(Runnable r) {
r.run();
}
static class R implements Runnable {
R() {
System.out.println("R constructor runs");
}
@Override
public void run() {
System.out.println("R.run runs");
}
}
}
输出结果为:
R constructor runs
-----------------------
R constructor runs
R.run runs
在第一个示例中,调用了 R
构造函数,它返回 lambda(不是对象):
但是这个例子怎么可能编译成功呢?
Runnable runnable = R::new;
runnable instanceof R
-> false - Prasad Karunagodanew
通常表示您想分配一些内存,并承诺自己会清理它。R::new
听起来只是一个工厂方法,在R中创建并返回Runnable实例的静态函数。如果没有将此实例分配给变量进行捕获,它可能在超出范围时被清除。 - kevin