Я не понимаю, почему присвоение функции без параметров типа приводит к ошибке компиляции:
Function f1 = (Integer x) -> x;
Я не понимаю почему, потому что я могу это сделать следующим образом:
Function f2 = (Function<Integer, Integer>)((Integer x) -> x);
f1 и f2 имеют одинаковые типы, но я могу выполнить второе назначение, но не первое.
Я тоже не могу выполнить следующее задание
Function<Object, Object> f3 = (Integer x) -> x;
но может это сделать:
Function<Integer, Object> f4 = (Integer x) -> x;
Пожалуйста, объясните, почему f2, f4 действительны, а f1 и f3 - нет.
Включите все предупреждения компилятора и исправьте их.




f1 недействителен, потому что f1 использует необработанные типы, и алгоритм вывода типов, вероятно, не пытается справиться с этим, потому что необработанные типы - это устаревшая функция для взаимодействия с кодом до Java 5; если вы используете лямбды, вы не используете код до Java 5 (здесь).
f2 действителен, потому что вы выполняете работу, которую не выполняет алгоритм вывода типов.
f3 недействителен, потому что Integer не является Object. Вы говорите: «вы можете передать Object в f3; но лямбда нужно, чтобы все, что вы передали, было Integer.
f4 действителен, потому что типы согласованы.
Вам не кажется, что Object - это не Integer, а Integer - это не Object?
На самом деле, для f1 кажется, что целевой тип - это стертая форма Function::apply, поэтому вам понадобится: Function f1 = (Object x) -> x;
В f4 вы утверждаете, что целое число соответствует объекту, но в f3 вы утверждаете, что это не так.
@Trismegistos в f4, Integer (первый параметр типа Function) соответствует типу параметра лямбда, Integer. В f3, Object параметр первого типа Function несовместим с типом параметра лямбда, Integer.
Объявите его как правильный тип,
Function<Integer, Integer>