我在文章中遇到了这样的代码(我简化了一点):
public class Main {
static class A {
}
public static void main(String[] args) {
new Thread(A::new).start();
}
}
我对该代码感到惊讶,因为从我的角度来看,它必须产生编译时错误,因为Thread
构造函数接受Runnable
但A
没有方法run
但它可以编译甚至启动,没有任何错误/异常。我在PC上进行了多种检查,但仍然可以正常工作。
所以我有以下问题:
为什么没有编译错误?
哪个方法执行而不是run方法?
答案 0 :(得分:4)
Runnable
是FunctionalInterface
,也可以用lambda表达式表示,就像您的情况一样:
new Thread(() -> new A())
这不过是方法引用的类似表示
A::new
在您的代码中等同于
new Runnable() {
@Override
public void run() {
new A(); // just creating an instance of 'A' for every call to 'run'
}
}