Почему этот вывод типа не работает с этим сценарием лямбда-выражения?
У меня есть странный сценарий, когда вывод типа не работает, как я ожидаю, используя лямбда-выражение. Вот приблизительный пример моего реального сценария:
static class Value<T> {
}
@FunctionalInterface
interface Bar<T> {
T apply(Value<T> value); // Change here resolves error
}
static class Foo {
public static <T> T foo(Bar<T> callback) {
}
}
void test() {
Foo.foo(value -> true).booleanValue(); // Compile error here
}
Ошибка компиляции, которую я получаю со второй по последнюю строку
Метод booleanValue () не определен для типа Object
если я приведу лямбду кBar<Boolean>
:
Foo.foo((Bar<Boolean>)value -> true).booleanValue();
или если я изменю сигнатуру методаBar.apply
использовать сырые типы:
T apply(Value value);
тогда проблема уходит. Я ожидаю, что это сработает так:
Foo.foo
вызов должен выводить тип возвратаboolean
value
в лямбде следует сделать выводValue<Boolean>
.Почему этот вывод не работает должным образом, и как я могу изменить этот API, чтобы он работал как положено?