Kotlin:功能类型不匹配

Posted

技术标签:

【中文标题】Kotlin:功能类型不匹配【英文标题】:Kotlin: Funtional Type mismatch 【发布时间】:2017-06-25 05:34:40 【问题描述】:

编译时出现以下错误:

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

谢谢

【问题讨论】:

【参考方案1】:

在 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

【讨论】:

【参考方案2】:

您不能将ConsisFilter_Click 分配给变量ConsisFilterClickEvent,因为它的隐式类型是(String, Boolean) -> Any 而不是(String, Boolean) -> Unit。由于 catch-block 的返回类型是 Unittry-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) 
    

【讨论】:

以上是关于Kotlin:功能类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

在kotlin中使用带有rxjava的密封类时,类型不匹配

当我使用 Kotlin 功能类型而不是 Java 功能接口来使用来自 Kafka 的消息时,缓存不起作用

java到kotlin类型不匹配[重复]

Kotlin:类型不匹配:推断类型是 Intent?但意图是预期的

Kotlin基础-接口

Android kotlin Object Any 类型不匹配