Ответ 1
Это ошибка.
Сообщено с идентификатором ошибки: JDK-8195598
Я упростил ваш пример далее:
public class Q48227496 {
public CompletableFuture<?> test() {
return ok(() -> System.out.append("aaa"));
}
public <T> CompletableFuture<T> ok(Supplier<T> action) {
return CompletableFuture.supplyAsync(action);
}
public <T> CompletableFuture<T> ok(T body) {
return CompletableFuture.completedFuture(body);
}
public CompletableFuture<Void> ok(Runnable action) {
return CompletableFuture.runAsync(action);
}
}
В версии выпуска Java 9 с "reference to ok is ambiguous
" это не выполняется, указав "both method <T>ok(Supplier<T>) in Q48227496 and method ok(Runnable) in Q48227496 match
".
Но просто изменив порядок методов
public class Q48227496 {
public CompletableFuture<?> test() {
return ok(() -> System.out.append("aaa"));
}
public <T> CompletableFuture<T> ok(T body) {
return CompletableFuture.completedFuture(body);
}
public <T> CompletableFuture<T> ok(Supplier<T> action) {
return CompletableFuture.supplyAsync(action);
}
public CompletableFuture<Void> ok(Runnable action) {
return CompletableFuture.runAsync(action);
}
}
заставляет компилятор принимать код без каких-либо ошибок.
Итак, очевидно, что это ошибка компилятора, так как порядок объявлений метода никогда не должен влиять на достоверность кода.
Кроме того, удаление метода ok(T)
делает код принятым.
Обратите внимание, что всякий раз, когда компилятор принимает код, он считает ok(Supplier)
более конкретным, чем ok(Runnable)
, что является ожидаемым поведением для параметра функции, который соответствует обоим.