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 }