В Java 1.8 следующее лямбда-выражение соответствует как функциональным интерфейсам Runnable
, так и Callable
:
() -> {
throw new RuntimeException("FIXME");
}
Тем не менее, если я отправлю его ExecutorService
с использованием метода с одним аргументом и игнорирует возвращаемое значение (т.е. информация о типе типа недоступна) ExecutorService#submit(Callable)
выбирается во время компиляции, если я явно не включил lambda в Runnable
.
Как компилятор выбирает между перегруженными методами в приведенном выше случае, при условии, что Runnable
и Callable
не имеют общей иерархии, а правило определенного типа не применяется здесь?