Почему допустимо создавать экземпляр 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'
    }
}
Другие вопросы по тегам