У меня странный сценарий, когда вывод типа не работает, как я ожидал бы при использовании выражения лямбда. Здесь приведен пример моего реального сценария:
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() - undefined для объекта Object
если я отбросил лямбда до Bar<Boolean>
:
Foo.foo((Bar<Boolean>)value -> true).booleanValue();
или если я изменяю подпись метода Bar.apply
для использования необработанных типов:
T apply(Value value);
тогда проблема уходит. То, как я ожидаю, что это сработает, это то, что:
-
Foo.foo
вызов должен выводить возвращаемый типboolean
-
value
в лямбда следует вывести наValue<Boolean>
.
Почему этот вывод не работает должным образом и как я могу изменить этот API, чтобы он работал должным образом?