我在编译时遇到错误:
类型不匹配:推断类型为(String,Boolean) - >除了((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
像这样分配
inputDialog!!.ConsisFilterClickEvent = ConsisFilter_Click
我在其他地方遵循相同的模式,但没有收到任何错误。只有这个特定的部分才会产生问题。难道我做错了什么。请帮帮我。
注意:如果我将ConsisFilter_Click
的所有代码(try catch块的代码)放入一个单独的函数中,只需从ConsisFilter_Click
调用该函数,那么每个都可以正常工作
由于
答案 0 :(得分:4)
在Kotlin中使用lambda时,如果推断的返回类型不是Unit
,the last expression in it is returned。在您的情况下,这是try-catch语句,它在Kotlin中也有效as an expression。
如果你想强制你的lambda的返回类型是Unit
,你可以按照另一个答案中的说明明确记下它的类型,或者你可以直接将它分配给ConsisFilterClickEvent
而不是存储它首先在另一个变量中 - 在这两种情况下,编译器都会发现你不想返回你的最后一个表达式,只想使用try-catch作为语句。
您可以做的另一件事是在lambda的末尾显式返回Unit
对象:
private val ConsisFilter_Click = { filterText: String, isStrictSearch: Boolean ->
try {
...
}
catch (e: Exception) {
...
}
Unit
}
答案 1 :(得分:3)
您无法将ConsisFilter_Click
分配给变量ConsisFilterClickEvent
,因为其隐式类型为(String, Boolean) -> Any
而不是(String, Boolean) -> Unit
。由于 catch-block 的返回类型为Unit
,但 try-block 的最后一个语句的返回类型不是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) {}
}
}