android - Kotlin:功能类型不匹配

标签 android kotlin

编译时出现以下错误:

类型不匹配:推断的类型是 (String, Boolean) -> Any but ((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 block 的代码)放入一个单独的函数中,然后简单地从 ConsisFilter_Click 中调用该函数> 那么这一切都很好

谢谢

最佳答案

在 Kotlin 中使用 lambda 时,如果推断的返回类型不是 Unitthe last expression in it is returned .在你的例子中,这是 try-catch 语句,它也有效 as an expression在 Kotlin 中。

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

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

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

关于android - Kotlin:功能类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44743511/

相关文章:

安卓工作室 : change textSize on Custom extends activity

java - 我如何从Android中的毫秒数中获取一天中的小时数

kotlin - 在 Kotlin 中实现 Cloudinary 签名上传

android - 为什么 place.latLng 返回 null?

android - 将数据存储在 kotlin 对象中是否安全?

gradle - Spek插件无法在运行时中发现方法,并引发异常:NoSuchMethodError Exception

android - "Views added to a FragmentContainerView must be associated with a Fragment"与 android 导航组件

android - Ionic 应用程序无法加载 Stripe javascript

c# - Xamarin,Android-MySQL 连接错误

performance - Kotlin:大量 ConsPStack,我该如何避免?