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