Почему допустимо создавать экземпляр Thread с аргументом NON Runnable?
Я столкнулся с кодом, подобным этому (я немного упростил его) в статье:
public class Main {
static class A {
}
public static void main(String[] args) {
new Thread(A::new).start();
}
}
Я удивился этому коду, потому что, с моей точки зрения, он должен давать ошибку во время компиляции, потому что Thread
конструктор принимает Runnable
но A
не имеет метид run
но он компилируется и даже запускается без каких-либо ошибок / исключений. Я проверил его на своем компьютере в нескольких вариантах, и все равно работает.
Итак, у меня есть следующие вопросы:
Почему нет ошибок компиляции?
Какой метод выполняется вместо метода run?
1 ответ
Решение
Runnable
это FunctionalInterface
который также может быть представлен в лямбда-выражении, как в вашем случае:
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'
}
}