Kotlin:功能类型不匹配

时间:2017-06-25 05:34:41

标签: android kotlin

我在编译时遇到错误:

类型不匹配:推断类型为(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调用该函数,那么每个都可以正常工作

由于

2 个答案:

答案 0 :(得分:4)

在Kotlin中使用lambda时,如果推断的返回类型不是Unitthe 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) {}
    }
}