Не может быть назначен функции без параметров типа

Я не понимаю, почему присвоение функции без параметров типа приводит к ошибке компиляции:

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 - нет.

Объявите его как правильный тип, Function<Integer, Integer>

David Conrad 05.04.2018 15:44

Включите все предупреждения компилятора и исправьте их.

VGR 05.04.2018 16:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
43
1

Ответы 1

f1 недействителен, потому что f1 использует необработанные типы, и алгоритм вывода типов, вероятно, не пытается справиться с этим, потому что необработанные типы - это устаревшая функция для взаимодействия с кодом до Java 5; если вы используете лямбды, вы не используете код до Java 5 (здесь).

f2 действителен, потому что вы выполняете работу, которую не выполняет алгоритм вывода типов.

f3 недействителен, потому что Integer не является Object. Вы говорите: «вы можете передать Object в f3; но лямбда нужно, чтобы все, что вы передали, было Integer.

f4 действителен, потому что типы согласованы.

Вам не кажется, что Object - это не Integer, а Integer - это не Object?

Morchul 05.04.2018 15:03

На самом деле, для f1 кажется, что целевой тип - это стертая форма Function::apply, поэтому вам понадобится: Function f1 = (Object x) -> x;

Jorn Vernee 05.04.2018 15:04

В f4 вы утверждаете, что целое число соответствует объекту, но в f3 вы утверждаете, что это не так.

Trismegistos 06.04.2018 11:14

@Trismegistos в f4, Integer (первый параметр типа Function) соответствует типу параметра лямбда, Integer. В f3, Object параметр первого типа Function несовместим с типом параметра лямбда, Integer.

Andy Turner 06.04.2018 11:31

Другие вопросы по теме