Почему этот вывод типа не работает с этим сценарием лямбда-выражения?

У меня есть странный сценарий, когда вывод типа не работает, как я ожидаю, используя лямбда-выражение. Вот приблизительный пример моего реального сценария:

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 вызов должен выводить тип возвратаbooleanvalue в лямбде следует сделать выводValue<Boolean>.

Почему этот вывод не работает должным образом, и как я могу изменить этот API, чтобы он работал как положено?

Ответы на вопрос(6)

Ваш ответ на вопрос