Kotlin:功能类型不匹配

编译时出现以下错误:

类型不匹配:推断的类型是(String,Boolean) – > Any,但((String,Boolean) – > Unit)? 预计

我的类型声明是

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所有代码(try catch块的代码)放到一个单独的函数中,只需从ConsisFilter_Click调用该函数,那么每个代码都可以很好地工作

谢谢

因为其隐式类型是(String, Boolean) -> Any而不是(String, Boolean) -> Unit所以不能将ConsisFilter_Click分配给变量ConsisFilterClickEvent 。 由于catch块的返回类型是Unit但是try块的最后一个语句的返回类型不是Unit ,如果不使用显式类型变量,将会使得lambda的返回类型为Any

您必须明确定义变量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) {} } } 

在Kotlin中使用lambda时,如果推断的返回类型不是Unit , 则返回其中的最后一个表达式 。 在你的情况下,这是try-catch语句,它也可以作为 Kotlin中的一个表达式 。

如果你想要强制你的lambda的返回类型为Unit ,你可以按照其他的回答来明确地写下它的类型,或者直接把它分配给ConsisFilterClickEvent而不是ConsisFilterClickEvent它存储在另一个变量中 – 在这两种情况下,编译器会发现你不想返回你的最后一个表达式,只想使用try-catch作为语句。

你可以做的另一件事是在你的lambda的末尾显式返回Unit对象:

 private val ConsisFilter_Click = { filterText: String, isStrictSearch: Boolean -> try { ... } catch (e: Exception) { ... } Unit }