Котлин: несоответствие типа Funtional

При компиляции я становлюсь ниже ошибки:

Тип несоответствия: inferred type (String, Boolean) -> Any, но ((String, Boolean) -> Unit)? ожидалось

Объявление My Type

private val ConsisFilter_Click = { filterText: String, isStrictSearch: Boolean -> try { //My Codes } catch (e: Exception) { try { alert{}.show() }catch (ignored: Exception) {} } } var ConsisFilterClickEvent:((filterText: String, isStrictSearch: Boolean) -> Unit)? = null 

assigninkg как это

 inputDialog!!.ConsisFilterClickEvent = ConsisFilter_Click 

Я следую тому же шаблону в другом месте, но не получаю никакой ошибки. Только эта конкретная деталь дает проблемы. Я делаю что-то неправильно. Пожалуйста, помогите мне.

ПРИМЕЧАНИЕ. Если я поместил все коды ConsisFilter_Click (код блока catch try) в отдельную функцию и просто ConsisFilter_Click эту функцию из ConsisFilter_Click тогда все это хорошо работает

благодаря

вы не можете назначить ConsisFilter_Click переменной ConsisFilterClickEvent так как ее неявный тип (String, Boolean) -> Any а не (String, Boolean) -> Unit . из-за типа возврата блока catch является Unit но тип возврата последнего оператора try-блока не является Unit , что сделает тип возврата лямбда « Any если вы не используете явную переменную типа.

вы должны явно определить тип переменной ConsisFilter_Click как ConsisFilter_Click ниже:

 val ConsisFilter_Click: (filterText: String, isStrictSearch: Boolean) -> Unit = { filterText: String, isStrictSearch: Boolean -> try { //My Codes } catch (e: Exception) { try { alert{}.show() }catch (ignored: Exception) {} } } 

При использовании лямбда в Котлине, если тип возвращаемого возврата не является Unit , возвращается последнее выражение в нем . В вашем случае это оператор try-catch, который также работает как выражение в Kotlin.

Если вы хотите, чтобы ваш тип возврата лямбда был Unit , вы можете явно записать его тип, как указано в другом ответе, или вы можете напрямую назначить его ConsisFilterClickEvent вместо того, чтобы ConsisFilterClickEvent сохранить его в другой переменной – в обоих случаях , компилятор выяснит, что вы не хотите возвращать свое последнее выражение и просто хотите использовать try-catch в качестве инструкции.

Другое, что вы можете сделать, это явно вернуть объект Unit в конце вашей лямбда:

 private val ConsisFilter_Click = { filterText: String, isStrictSearch: Boolean -> try { ... } catch (e: Exception) { ... } Unit } 
Intereting Posts
java.lang.NoSuchMethodException: com … Сотрудник. <init> () Не удалось настроить обновление плагина kotlin? Kotlin – Незаконное использование обратного вызова встроенного параметра Kotlin: Невозможно ли переименовать карту с деструктивным входом? Ошибка? Google Fit данные не читаются из облака, только чтение локально Kotlin – Maven не выполняет тесты Случай использования анонимной функции Kotlin? Сочетание результатов нескольких наблюдаемых Как использовать код, который опирается на ThreadLocal с сопрограммами Kotlin Запуск тестов из Android Studio IDE не восстанавливает чистый библиотечный модуль Java Предупреждение о компиляторе Android Studio Kotlin Ошибка при обработке аннотаций с помощью Kapt и Dagger2 Работа для администратора устройства api не имеет собственного профиля Kotlin – Как я могу вернуть разные типы из моего метода? Библиотека Kotlin 'rxkotlin-0.21.0.jar' имеет неподдерживаемый формат. Обновите библиотеку или плагин